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

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)

  • 还有一个额外的要求仍然需要满足:"BUT 2"只有第一个列表项,垂直切片应该只遵循第一个列表项的顺序." 通过向运算符import itemgetter中的`sorted()`:`添加一个键参数来解决; list(map(list,zip(*sorted(zip(*listOfLists),key = itemgetter(0)))))`(我还假设他仍然想要列表列表,所以我转换了你的外部列表(...) `to`list(map(list,...))`.) (2认同)
  • 我引用了OP的要求.另请参阅标题中的"其他列表遵循交换顺序".跟随和影响之间存在差异.给出一个原始列表`[['b','a','b'],['z','x','a']]`我认为基于OPs的描述是"[["的结果a','b','b'],['x','a','z']]`是不正确的,应该是`[['a','b','b'],[ 'x','z','a']]`.拉链元素应该是骑行的,而不是后座驾驶员. (2认同)
  • 最后一个例子,我会放弃观点并同意不同意.开始列表`[['a','a'],['n','m'],['x','y']]和起始列表`[['a','a'], ['x','y'],['n','m']]`将根据行顺序以不同方式排序.所以我的观点是行顺序无关紧要.第一行是确定排序顺序的键值.任何流血都违反了这个问题.我将引用问题的第三部分"列表列表中的其余项目不按字母顺序排序,而是按照列表中第一项的切换和排序模式进行排序." (2认同)