打破Python中的联系

时间:2014-07-04 18:13:37

标签: python sorting

我有一个list tuple个,每个元组包含两个整数。我需要根据每个元组中整数的差异对列表进行排序(以相反的顺序排序),但是要打破与较大的第一个整数的关系。

示例

对于[(5, 6), (4, 1), (6, 7)],我们应该[(4, 1), (6, 7), (5, 6)]

我的方式

我已经通过制作一个dictionary来解决它,其中包含key的差异和value的元组。但整件事情有点笨拙。

什么是更好的方式?

2 个答案:

答案 0 :(得分:16)

使用key函数sorted()并返回元组;值将按字典顺序排序:

sorted(yourlst, key=lambda t: (abs(t[0] - t[1])), t[0]), reverse=True)

我在这里使用abs()来计算差异,无论两个整数中哪一个更大。

对于您的示例输入,密钥会生成(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)]

答案 1 :(得分:1)

鉴于此list=[('a','b',3),('d','e',3),('e','f',5)],如果您想按数字降序排列,但要使用第一个字母的升序来打领带(当计数等于本示例中的“ 3”时)元素,然后是第二个元素,下面的代码可以正常工作:

sorted(list,key=lambda x: (-x[2],x[0],x[1]))

此处,x [2]上的'-'符号表示需要按降序排序。 输出将为:[('e', 'f', 5), ('a', 'b', 3), ('d', 'e', 3)]