【问题标题】:Sorted function using compare function使用比较函数的排序函数
【发布时间】:2015-07-15 13:28:33
【问题描述】:

我想对每个“行”大小为 2 的 2D 列表进行排序,例如

[[2,5],[2,3],[10,11]]

这些行实际上代表范围,所以它总是 [a,b] where a

我想以这种方式对其进行排序,列表的每个元素都是一个 2 列表,我将拥有(按优先级顺序): [a1, b1] 与 [a2, b2] 相比

 1. If a1 < a2 do not permute
 2. If a1 > a2 permute
 3. If a1 == a2 then permute if (b1 - a1) > (b2 - a2)

我觉得有点愚蠢的是python不再允许比较函数。相反,它使用一个键功能。由于我的比较基于两个参数,即“a”的数值(占主导地位)和范围的长度(b - a),因此我无法使用它来制作有效的密钥。

我该如何排序?我的意思是,没有调用两次 sorted() 之类的东西,在我看来这很丑陋。

有可能吗?还是有什么我没看到的?

谢谢!

【问题讨论】:

  • 在 python 3.3.3 上调用 sorted(elements, cmp=func) 时,它告诉我“'cmp' is an invalid keyword argument for this function”
  • docs 提供了cmpkey 的转换功能,但并不是那么漂亮。
  • 您也可以为内部列表创建一个类并覆盖__cmp__函数

标签: python sorting python-3.x


【解决方案1】:

虽然有些情况是key 无法处理的。这不是其中的一个。解决办法是让key函数返回一个tuple

>>> L = [[2, 5], [2, 3], [10, 11]]
>>> sorted(L, key=lambda x:(x[0], x[1] - x[0]))
[[2, 3], [2, 5], [10, 11]]

【讨论】:

  • 我很好奇使用key无法解决的案例。请问你有例子吗?
  • 非常感谢!我第二个@Delgan,很高兴知道哪些情况无法解决(我不知道元组是一个可行的解决方案)
  • @Delgan,假设子列表是[firstname, surname] 我需要按姓氏排序。在姓氏相等的地方,我需要按名字排序 - 但相反。
  • @JohnLaRooy key=lambda x:(x[1], [-ord(i) for i in x[0]]) 应该可以工作,我错了吗?但是,这可能不是很好,我想知道解决这个问题的正确方法是什么。
猜你喜欢
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多