如果我的列表包含一个看起来像这样的列表......
['a',1] ['a',2] ['a',3] ['b',1] ['b',2] ['b',3]
我如何对它们进行排序,以便元素0按降序排序,元素1按升序排序,因此结果看起来像......
['b',1] ['b',2] ['b',3] ['a',1] ['a',2] ['a',3]
使用itemgetter
我可以在元素0上反向传递,但是我然后使用元素,当然它会破坏前一种类型。我不能做一个组合键,因为它需要先降序然后升序。
TIA, PK
答案 0 :(得分:43)
L = [['a',1], ['a',2], ['a',3], ['b',1], ['b',2], ['b',3]]
L.sort(key=lambda k: (k[0], -k[1]), reverse=True)
L
现在包含:
[['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]]
答案 1 :(得分:35)
你可以连续几轮排序,因为python的sort
是stable。您需要先对辅助密钥进行排序。另请参阅official HOW TO。
from operator import itemgetter
l = [['a',2], ['a',1], ['b', 2], ['a',3], ['b',1], ['b',3]]
l.sort(key=itemgetter(1))
l.sort(key=itemgetter(0), reverse=True)
# [['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]]
答案 2 :(得分:2)
像
这样的东西def mycmp(a, b):
res = cmp(a[0], b[0])
if res == 0:
return cmp(a[1], b[1])
return res
newlist = sorted(input_list, cmp=mycmp)
比较方法首先检查每个元素的第一项。如果它们相等,它将检查每个元素的第二项。为了实现不同的排序行为,可以取消mycmp()实现中的返回值。