对列表列表按升序排序,然后按降序排序[重复]
- 2025-02-05 13:24:00
- admin 原创
- 99
问题描述:
如果我有一个包含如下列表的列表
['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,但随后我求助于元素,当然这会破坏之前的排序。我无法使用组合键,因为它需要先按降序排序,然后按升序排序。
解决方案 1:
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]]
解决方案 2:
由于 Python 的排序算法比较稳定,因此您可以进行连续几轮排序。不过,您需要先对辅助键进行排序。另请参阅官方的 HOW TO。sort
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]]
解决方案 3:
类似于
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() 实现中的返回值可能为负数,以便实现不同的排序行为。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD