使用自定义键在python中排序元组

Ant*_*mud 4 python sorting tuples

嗨:我正在尝试以自定义方式对元组列表进行排序:
例如:

lt = [(2,4), (4,5), (5,2)]
Run Code Online (Sandbox Code Playgroud)

必须排序:

lt = [(5,2), (2,4), (4,5)]
Run Code Online (Sandbox Code Playgroud)

规则:
*如果[1] == b [0]
*元组大于b元组,如果[0] == b [1],则b元组大于元组

我已经实现了这样的cmp函数:

def tcmp(a, b):
    if a[1] == b[0]:
       return -1
    elif a[0] == b[1]:
       return 1
    else:
       return 0
Run Code Online (Sandbox Code Playgroud)

但排序列表:

lt.sort(tcmp)
Run Code Online (Sandbox Code Playgroud)

给我看看:

lt = [(2, 4), (4, 5), (5, 2)]
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

met*_*fox 11

听起来很多,你试图解决谷歌的Python类问题之一,即根据最后一个元素按顺序对元组列表进行排序.

我是怎么做到的:

def sort_last(tuples):

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

  return sorted(tuples, key=last_value_tuple)
Run Code Online (Sandbox Code Playgroud)

编辑:我没有阅读整个事情,我认为它是基于元组的最后一个元素.好吧,我还是要留在这里因为它对任何人都有用.


小智 6

您也可以使用lambda编写代码

def sort(tuples):
  return sorted (tuples,key=lambda last : last[-1])
Run Code Online (Sandbox Code Playgroud)

所以 sort([(1, 3), (3, 2), (2, 1)]) 将产生 [(2, 1), (3, 2), (1, 3)]


Eli*_*sky 2

我不确定您的比较函数在数学意义上(即传递性)是否有效。给定a, b, c一个比较函数,表示a > bb > c暗示a > c。排序过程依赖于这个属性。

更不用说根据您的规则, fora = [1, 2]b = [2, 1]您都具有a[1] == b[0]and a[0] == b[1],这意味着a 既大于又小于 b