【问题标题】:Breaking ties in Python sort在 Python 排序中打破关系
【发布时间】:2014-07-04 18:13:37
【问题描述】:

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

示例

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

我的方式

我已经通过创建一个dictionary 解决了这个问题,其中包含key 的差异和value 的元组。但是整个事情有点笨拙。

有什么更好的方法?

【问题讨论】:

  • 应该6,7 优先还是5,6
  • @PadraicCunningham 6, 76 > 5.
  • 为什么答案中的输出是(5, 4), (6, 7) then?
  • @PadraicCunningham:OP 更改了样本,我正在更新我的答案以反映这一点。
  • @MartijnPieters,我明白了,考虑到问题包括“与较大的第一个整数断绝关系”,这是有道理的。

标签: python sorting


【解决方案1】:

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

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)]

【讨论】:

    【解决方案2】:

    鉴于此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)]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 2020-07-08
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多