对嵌套列表排序,先升序再降序
如果我有一个包含列表的列表,像这样
['a',1] ['a',2] ['a',3] ['b',1] ['b',2] ['b',3]
我该如何排序,使得第一个元素是降序排列,而第二个元素是升序排列,最终结果看起来像这样
['b',1] ['b',2] ['b',3] ['a',1] ['a',2] ['a',3]
使用 itemgetter
我可以对第一个元素进行降序排序,但如果我再对第二个元素进行排序,那就会破坏之前的排序。我不能使用组合键,因为它需要先降序排序,然后再升序排序。
3 个回答
4
类似这样的内容:
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()这个函数的实现中,返回的值可以取反,这样就能实现不同的排序方式。
70
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]]