您好:
我试图以自定义方式对元组列表进行排序:
例如:
lt = [(2,4), (4,5), (5,2)]
必须对进行排序:
lt = [(5,2), (2,4), (4,5)]
规则:
* b元组大于元组,如果[1] == b [0]
*如果[0] == b [1]
我已经实现了这样的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)]
我做错了什么?
答案 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 > b
和b > c
表示a > c
。排序程序依赖于此属性。
更不用说根据您的规则,对于a = [1, 2]
和b = [2, 1]
,您同时拥有a[1] == b[0]
和a[0] == b[1]
,这意味着 a既大于也小于b'/ em>的
答案 4 :(得分:0)
您的订购规格错误,因为它不是transitive。
及物性意味着如果a < b
和b < c
,则a < c
。但是,在您的情况下:
(1,2) < (2,3)
(2,3) < (3,1)
(3,1) < (1,2)
答案 5 :(得分:-1)
尝试lt.sort(tcmp, reverse=True)
。
(虽然这可能会产生正确答案,但您的比较方法可能存在其他问题)