使用自定义键对Python中的元组排序

9 投票
6 回答
26384 浏览
提问于 2025-04-16 09:09

你好:
我正在尝试以一种自定义的方式对一个元组列表进行排序:
例如:

lt = [(2,4), (4,5), (5,2)]

必须排序为:

lt = [(5,2), (2,4), (4,5)]

规则:
* 如果元组b的第一个元素等于元组a的第二个元素,那么元组b就比元组a大。
* 如果元组a的第一个元素等于元组b的第二个元素,那么元组a就比元组b大。

我实现了一个比较函数,像这样:

def tcmp(a, b):
    if a[1] == b[0]:
       return -1
    elif a[0] == b[1]:
       return 1
    else:
       return 0

但是在对列表进行排序时:

lt.sort(tcmp)

结果给我显示:

lt = [(2, 4), (4, 5), (5, 2)]

我哪里做错了?

6 个回答

7

你也可以用lambda来写你的代码。

def sort(tuples):
  return sorted (tuples,key=lambda last : last[-1])

这样,使用sort([(1, 3), (3, 2), (2, 1)])就会得到[(2, 1), (3, 2), (1, 3)]这个结果。

15

听起来你是在尝试解决谷歌的Python课程中的一个问题,就是根据元组的最后一个元素来对一个元组列表进行升序排序。

这是我解决这个问题的方法:

def sort_last(tuples):

  def last_value_tuple(t):
    return t[-1]

  return sorted(tuples, key=last_value_tuple)

编辑:我没有仔细看整个内容,以为是根据元组的最后一个元素来排序。不过,我还是把这个方法留在这里,因为对其他人可能会有帮助。

2

我不太确定你的比较函数在数学上是否有效,也就是说,它是否符合传递性。举个例子,假设有三个值 a, b, c,如果比较函数说 a > b 并且 b > c,那么就应该能推出 a > c。排序的过程是依赖于这个特性的。

更不用说,根据你的规则,对于 a = [1, 2]b = [2, 1],你会发现 a[1] == b[0]a[0] == b[1],这就意味着 a 同时大于和小于 b

撰写回答