Python排序中的平局处理

8 投票
2 回答
9547 浏览
提问于 2025-04-18 12:08

我有一个包含多个元组的列表,每个元组里有两个整数。我需要按照每个元组中两个整数的差值来对这个列表进行排序,排序要倒过来,也就是说差值大的排在前面。如果差值相同,就要把第一个整数大的排在前面。

举个例子

比如对于 [(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)]

撰写回答