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

时间:2010-12-29 12:34:41

标签: python sorting tuples

您好: 我试图以自定义方式对元组列表进行排序:
例如:

lt = [(2,4), (4,5), (5,2)]
必须对

进行排序:

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

规则:
* b元组大于元组,如果[1] == b [0]
*如果[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

但是对列表进行排序:

lt.sort(tcmp)

向我展示:

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

我做错了什么?

6 个答案:

答案 0 :(得分:11)

对我而言,你正试图解决谷歌的Python类问题之一,这就是根据最后一个元素按顺序对元组列表进行排序。

我是这样做的:

def sort_last(tuples):

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

  return sorted(tuples, key=last_value_tuple)
编辑:我没有阅读整个内容,我认为它是基于元组的最后一个元素。好吧,我仍然会把它留在这里因为它对任何人都有用。

答案 1 :(得分:4)

您可以编写自己的自定义键功能来指定排序的键值。

实施例

def sort_last(tuples):

    return sorted(tuples, key=last)

def last(a):
    return a[-1]

元组=>按最后一个元素排序的元组

  • [(1, 3), (3, 2), (2, 1)] => [(2, 1), (3, 2), (1, 3)]
  • [(1, 7), (1, 3), (3, 4, 5), (2, 2)] => [(2, 2), (1, 3), (3, 4, 5), (1, 7)]

答案 2 :(得分:4)

您也可以使用 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)]

答案 3 :(得分:2)

我不确定你的比较函数是否是数学意义上的有效函数,即传递函数。给定a, b, c比较函数,表示a > bb > c表示a > c。排序程序依赖于此属性。

更不用说根据您的规则,对于a = [1, 2]b = [2, 1],您同时拥有a[1] == b[0]a[0] == b[1],这意味着 a既大于也小于b'/ em>的

答案 4 :(得分:0)

您的订购规格错误,因为它不是transitive

及物性意味着如果a < bb < c,则a < c。但是,在您的情况下:

(1,2) < (2,3)
(2,3) < (3,1)
(3,1) < (1,2)

答案 5 :(得分:-1)

尝试lt.sort(tcmp, reverse=True)

(虽然这可能会产生正确答案,但您的比较方法可能存在其他问题)