对多个键上的元组列表进行排序

时间:2013-09-15 17:45:13

标签: python list sorting

我想对元组列表进行排序,其中元组的类型为(a, b),其中ab是整数。排序列表的关键应该是ab之间的差异,即a - b,要打破关系,它应按a排序,两者都按降序排列。< / p>

我试过用这个:

def sort(list):
        scores = sorted(list, key=lambda list: list[0], reverse=True)
        scores = sorted(list, key=lambda list: (a - b), reverse=True)

但是,这似乎排除了差异并重新排序元组的第一个元素上排序的元素。

例如:

输入:

[(75, 10),  (88, 4), (93, 9), (80, 5), (94, 10)]

预期输出:

[(94, 10), (93, 9), (88, 4), (80, 5), (75, 10)]

获得的输出:

[(93, 9), (88, 4), (94, 10), (80, 5), (75, 10)]

5 个答案:

答案 0 :(得分:4)

您可以对复合键进行排序:

>>> def sort(list):
...     return sorted(list, key=(lambda (a, b): ((a - b), a)), reverse=True)
... 
>>> sort([(75, 10),  (88, 4), (93, 9), (80, 5), (94, 10)])
[(94, 10), (93, 9), (88, 4), (80, 5), (75, 10)]

请参阅Python Wiki Sorting Howto了解一些不错的提示。

答案 1 :(得分:1)

list_sorted = sorted(list, key = lambda x: (x[0]-x[1], x[0]), reverse=True)

lambda key可以返回元组,其顺序可以指示排序优先级。

答案 2 :(得分:1)

要获得您要查找的订单,请使用复合键排序:

def sort(l):
    scores = sorted(l, key=lambda(e): (e[0] - e[1], e[0]), reverse=True)

这将产生:

scores = [(94, 10), (93, 9), (88, 4), (80, 5), (75, 10)]

N.B: list是一个关键字,不应该用作变量名。

答案 3 :(得分:1)

关键lambda想要一个输入值(一个元组可以)

sorted(data, key=lambda (a, b): (a-b, a), reverse=True)

答案 4 :(得分:0)

抱歉,我没有打破这种关系:/。我没有使用任何复杂的任何复杂的订单......这里:

def sort(list):
    scores = sorted(list, key=lambda a: a[0], reverse=True)

    return scores

print sort([(75, 10),  (88, 4), (93, 9), (80, 5), (93, 11), (94, 10)])

控制台:

[(94, 10), (93, 9), (93, 11), (88, 4), (80, 5), (75, 10)]

当我对差异进行排序时,a-b,这就是结果:

def sort(list):

    scores = sorted(list, key=lambda a: a[0], reverse=True)
    scores = sorted(list, key=lambda a: a[0]-a[1], reverse=True)

    return scores

print sort([(75, 10),  (88, 4), (93, 9), (80, 5), (93, 11), (94, 10)])

控制台:

[(88, 4), (93, 9), (94, 10), (93, 11), (80, 5), (75, 10)]