Python在列表列表中按字母表对列表项进行排序,并让其他列表遵循交换的ord

2024-06-28 14:37:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Python中按第一行对列表进行排序(特别是不使用Numpy,我知道有很多解决方案使用Numpy,但这是一个专门要求不使用Numpy的方法的问题)

这是我的列表:

listOfLists = [ ['m', 'e', 'l', 't', 's'],
                ['g', 'p', 's', 'k', 't'],
                ['y', 'q', 'd', 'h', 's'] ]

我希望对这个列表进行排序1)按字母顺序,但2)仅按第一个列表项排序,垂直切片应遵循第一个列表项的顺序。例如:

^{pr2}$

ListOfList中的第一项是“熔体”,然后按字母顺序将其排序为“elmst”。列表列表中的其余项不是按字母顺序排序的,而是“遵循”列表中第一项的开关和排序模式。在

我可能有点可笑,但我已经花了几个小时在这个问题上(这是一个更大的计划的一部分)。我试着从列表列表中分割出第一个条目,并按字母顺序对其进行排序,然后将其与列表中未排序的第一个列表的片段进行比较,并比较位置。但我好像什么也做不到。在


Tags: 方法numpy列表排序顺序字母模式切片
2条回答

numpy是同时提高性能和可读性的方法:

import numpy as np

listOfLists = [ ['m', 'e', 'l', 't', 's'],
                ['g', 'p', 's', 'k', 't'],
                ['y', 'q', 'd', 'h', 's'] ]

lol = np.array(listOfLists)

lol[:, np.argsort(listOfLists[0])]

# array([['e', 'l', 'm', 's', 't'],
#        ['p', 's', 'g', 't', 'k'],
#        ['q', 'd', 'y', 's', 'h']], 
#       dtype='<U1')

numpy解决方案:

^{pr2}$

您可以使用zip来转置列表,对转置进行排序,然后将该列表转置回正确的维度之一。在

listOfLists = [ ['m', 'e', 'l', 't', 's'],
                ['g', 'p', 's', 'k', 't'],
                ['y', 'q', 'd', 'h', 's'] ]

print(list(zip(*sorted(zip(*listOfLists)))))
# [('e', 'l', 'm', 's', 't'), ('p', 's', 'g', 't', 'k'), ('q', 'd', 'y', 's', 'h')]

编辑:

正如@StevenRumbalski在评论中指出的那样,上面的方法将对垂直切片进行完全排序(按第一个字母,然后第二个字母等),而不是按第一个字母(先按第一个字母排序,然后按输入中的相对顺序排序)进行排序。我将在这里重现他的解决方案以便于查看:

^{pr2}$

相关问题 更多 >