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

Python—在列表列表中按字母表对列表项进行排序,并让其他列表遵循交换顺序,python,list,sorting,Python,List,Sorting,我试图在Python中按第一行对列表进行排序(特别是不使用Numpy,我知道有许多使用Numpy的解决方案,但这是一个特别需要一种不使用Numpy的方法的问题) 以下是我的列表: listOfLists = [ ['m', 'e', 'l', 't', 's'], ['g', 'p', 's', 'k', 't'], ['y', 'q', 'd', 'h', 's'] ] 我希望按字母顺序对列表进行排序,但2)仅按第一个列表项进行

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

以下是我的列表:

listOfLists = [ ['m', 'e', 'l', 't', 's'],
                ['g', 'p', 's', 'k', 't'],
                ['y', 'q', 'd', 'h', 's'] ]
我希望按字母顺序对列表进行排序,但2)仅按第一个列表项进行排序,垂直切片应仅遵循第一个列表项的顺序。例如:

newListofLists = [ ['e', 'l', 'm', 's', 't'],
                   ['p', 's', 'g', 't', 'k'],
                   ['q', 'd', 'y', 's', 'h'] ]
列表中的第一项是“熔化”,然后按字母顺序将其排序为“elmst”。列表列表中的其余项不是按字母顺序排序的,而是“遵循”列表中第一项的切换和排序模式


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

您可以使用
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在评论中指出的那样,上述内容将对垂直切片进行完全排序(按第一个字母,然后按第二个字母等),而不是按第一个字母进行稳定排序(按第一个字母排序,然后按输入中的相对顺序排序)。我将在这里复制他的解决方案以提高可视性:

from operator import itemgetter
list(map(list, zip(*sorted(zip(*listOfLists), key=itemgetter(0)))))

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')

OP不想使用NumpyThanks来花时间想出解决方案,但不幸的是,对于这个具体问题,我不想使用NumpyAnd,为什么不…?为什么不允许使用
numpy
呢?还有一个额外的要求仍然需要满足:“但是2)只有通过第一个列表项,垂直切片才应该遵循第一个列表项的顺序。”通过向
sorted()
从操作符import itemgetter;list(map(list,zip(*sorted(zip(*listOfLists),key=itemgetter(0)!)
(我还假设他仍然想要列表列表,所以我将您的外部
列表(…)
转换为
列表(映射(列表…)
)@StevenRumbalski这就是元组的排序方式。你会注意到你的解决方案和我的解决方案有相同的输出。唯一的区别是你的解决方案是稳定排序,而我的不是。因为OP没有指定,我倾向于认为这不是一个要求。我引用了给出要求的OP。另请参见标题中的“稳定排序”让其他列表遵循交换顺序”。遵循和影响之间是有区别的。给定一个原始的
[[['b','a','b'],['z','x','a']
列表,我认为基于OPs描述,
[['a','b','b'],['x','a','z']]
的结果是不正确的,应该是
[[code>['a','b','b'],['x','z','a]]
。压缩的元素应该只在旅途中出现,而不是后座驾驶员。最后一个例子,我将放弃这一点并同意不同意。起始列表
[['a','a'],['n','m'],['x','y']]
和起始列表
['a','a'],['x','y'],['n','m']
将根据行顺序以不同的方式结束排序。因此,我的观点是行顺序不重要。第一行是决定排序顺序的键值。任何漏出都会违反问题。我将引用问题的第三部分“列表列表中的其余项目不是按字母顺序排序的,而是“遵循”列表中第一个项目的切换和排序模式。”
idx = sorted(range(len(lol[0])), key=lol[0].__getitem__)

[list(map(lol[j].__getitem__, idx)) for j in range(len(lol))]