根据两个元素对元组列表进行排序

61
我有一个元组列表,就像这样:

[
    ('a', 4, 2), ('a', 4, 3), ('a', 7, 2), ('a', 7, 3),
    ('b', 4, 2), ('b', 4, 3), ('b', 7, 2), ('b', 7, 3)
]

我知道,比如要按照第二个元素对它们进行排序,可以使用:

sorted(unsorted, key = lambda element : element[1])

但是我该如何根据多个关键字对列表进行排序呢?

期望的结果应该是:

[
    ('a', 4, 2), ('b', 4, 2), ('a', 4, 3), ('b', 4, 3),
    ('a', 7, 2), ('b', 7, 2), ('a', 7, 3), ('b', 7, 3)
]

3
Python所进行的排序是稳定的,这意味着你实际上可以对其进行两次排序,首先按最不重要的元素排序,然后再按最重要的元素排序。在某些情况下,这实际上可能更快(但仅限于某些情况下)。 - Lennart Regebro
1
https://dev59.com/QW855IYBdhLWcg3woV4_ - cardamom
我重新打开了这个问题,因为之前的重复问题更加复杂,并且由于额外的复杂性而出现了特定的问题。按照相同顺序使用多个键进行排序是很简单的;但是,按一个键升序排列,按另一个键降序排列就比较棘手,特别是如果其中一个或两个键是字符串(对于整数,可以使用数学技巧)。 - Karl Knechtel
哦,等等,算了吧。@cardamom的重复链接更好,而且我已经将其保存为规范链接了。 - Karl Knechtel
1个回答

108
sorted(unsorted, key=lambda element: (element[1], element[2]))

我假设了示例输出中的键的顺序。


3
可能使用 sorted(unsorted, key=lambda element: (element[1:])) 或 sorted(unsorted, key=lambda element: (element[1:3])) 更好。 - pod2metra
9
有许多可能性。最好的可能是 operator.itemgetter(1,2) - Michael J. Barber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接