Python排序中的平局处理
我有一个包含多个元组的列表,每个元组里有两个整数。我需要按照每个元组中两个整数的差值来对这个列表进行排序,排序要倒过来,也就是说差值大的排在前面。如果差值相同,就要把第一个整数大的排在前面。
举个例子
比如对于 [(5, 6), (4, 1), (6, 7)]
,我们应该得到 [(4, 1), (6, 7), (5, 6)]
。
我的方法
我已经通过创建一个字典来解决这个问题,字典的键是差值,值是元组。但这样做有点麻烦。
有没有更好的方法呢?
2 个回答
2
给定这个 list=[('a','b',3),('d','e',3),('e','f',5)]
,如果你想按照数字从大到小排序,但在数字相同的情况下(比如这个例子中的两个'3'),再按照第一个元素和第二个元素的字母顺序从小到大排序,下面的代码就可以做到:
sorted(list,key=lambda x: (-x[2],x[0],x[1]))
这里的 '-' 符号表示要按照降序排序。最终的输出结果是: [('e', 'f', 5), ('a', 'b', 3), ('d', 'e', 3)]
21
使用一个 key
函数来给 sorted()
排序,并返回一个元组;这样值会按照字典顺序进行排序:
sorted(yourlst, key=lambda t: (abs(t[0] - t[1])), t[0]), reverse=True)
在这里我使用 abs()
函数来计算两个整数之间的差值,不管哪个整数更大。
对于你的示例输入,key 函数会生成 (1, 5)
、(3, 4)
和 (1, 6)
;在反向排序时,(1, 6)
(对应 (6, 7)
这个元组)会排在 (1, 5)
(对应 (5, 6)
)之前。
演示:
>>> yourlst = [(5, 6), (4, 1), (6, 7)]
>>> sorted(yourlst, key=lambda t: (abs(t[0] - t[1]), t[0]), reverse=True)
[(4, 1), (6, 7), (5, 6)]