use*_*420 3 python sorting list
我试图通过第一行在Python中对列表进行排序(特别是不使用Numpy,我知道有很多使用Numpy的解决方案,但这是一个特别要求不使用Numpy的方法的问题)
这是我的清单列表:
listOfLists = [ ['m', 'e', 'l', 't', 's'],
['g', 'p', 's', 'k', 't'],
['y', 'q', 'd', 'h', 's'] ]
Run Code Online (Sandbox Code Playgroud)
我希望按照字母顺序排序此列表1)但仅由第一个列表项排序,垂直切片应该遵循第一个列表项的顺序.例如:
newListofLists = [ ['e', 'l', 'm', 's', 't'],
['p', 's', 'g', 't', 'k'],
['q', 'd', 'y', 's', 'h'] ]
Run Code Online (Sandbox Code Playgroud)
listOfLists中的第一项是'melts',然后按字母顺序排序成'elmst'.列表列表中的其余项目不按字母顺序排序,而是"跟随"列表中第一项的切换和排序模式.
我可能很荒谬,但我花了好几个小时来处理这个问题(这是一个更大的程序的一部分).我已经尝试从列表列表中切割第一个项目并按字母顺序对其进行排序,然后将其与未排序的列表列表中的第一个列表的切片进行比较,并比较位置.但我似乎无法得到任何工作.
Pat*_*ugh 11
您可以使用转置列表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')]
Run Code Online (Sandbox Code Playgroud)
编辑:
正如@StevenRumbalski在评论中指出的那样,上面将完全排序垂直切片(通过第一个字母,然后是第二个字母等),而不是通过第一个字母稳定地排序它们(按首字母排序,然后按输入中的相对顺序排序) ).我会在这里重现他的解决方案以获得可见性:
from operator import itemgetter
list(map(list, zip(*sorted(zip(*listOfLists), key=itemgetter(0)))))
Run Code Online (Sandbox Code Playgroud)