使用自定义键对Python中的元组排序
你好:
我正在尝试以一种自定义的方式对一个元组列表进行排序:
例如:
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。