python对二维列表进行排序而不使用lambda
Posted
技术标签:
【中文标题】python对二维列表进行排序而不使用lambda【英文标题】:python sort a 2d list without using lambda 【发布时间】:2022-01-06 21:49:45 【问题描述】:所以我有这个清单:
lst = [[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]]
我想对它进行相应的排序:第一个索引的顺序相反,如果两个项目具有相同的第一个索引,那么按照第二个索引的正常顺序
所以输出将是:
lst = [[7, 0], [7, 1], [6, 1], [5, 0], [5, 2], [4, 4]]
我可以使用 lambda 函数来做到这一点:
lst = [[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]]
lst.sort(key = lambda x : (-x[0], x[1]))
但是如果我不想使用 lambda,我该怎么做呢?我有这个模板,但不知道如何从这里开始:
lst = [[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]]
def compare(input):
# put code here
lst.sort(key = compare(#what and how do I pass as input))
【问题讨论】:
返回与您的 lambda 相同的内容:def compare(x): return (-x[0], x[1])
lambda
基本上是def
的快捷方式,您不必为函数命名。
lst.sort(key=compare)
是正确的。你没有传递任何输入。你只是在传递函数。 sort
函数将调用您的函数并传递正确的输入。
添加到上面的 cmets 中,在 list.sort
中传递函数对象。你不叫它。 lst.sort(key=compare)
应该写。
我强烈建议不要调用你的 key 函数compare
。排序函数通常接受 key 函数或 comparison 函数作为输入。在 python2 中,可以通过传递 comparison 函数进行排序。在 python3 中,这是不可能的,你应该总是传递一个 key 函数;但是有functools.cmp_to_key 将比较函数包装成关键函数。调用您的 key 函数“比较”会让人感到困惑,对您和阅读您的代码的人来说都是如此。
【参考方案1】:
Python 的排序是“稳定的”,因此它会将具有相同排序键的项目保持在其原始相对顺序中。这意味着您可以执行两种排序,从最不重要的顺序开始并获得您正在寻找的结果:
lst = [[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]]
from operator import itemgetter
lst.sort(key=itemgetter(1)) # ascending 2nd index
lst.sort(key=itemgetter(0),reverse=True) # descending 1st index (stable)
print(lst)
[[7, 0], [7, 1], [6, 1], [5, 0], [5, 2], [4, 4]]
如果您需要使用自定义比较功能,您会找到解决方案here。
【讨论】:
以上是关于python对二维列表进行排序而不使用lambda的主要内容,如果未能解决你的问题,请参考以下文章