2

我想对一个元组列表进行排序,其中元组的类型是(a, b)whereab是整数。排序列表的关键应该是和之间的差异aba - b打破平局,它应该a按降序排序。

我尝试使用这个:

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)]
4

5 回答 5

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

于 2013-09-15T17:49:39.223 回答
1
list_sorted = sorted(list, key = lambda x: (x[0]-x[1], x[0]), reverse=True)

lambdaforkey可以返回其顺序可以指示排序优先级的元组。

于 2013-09-15T17:50:11.970 回答
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)]

注意: list是关键字,不应用作变量名。

于 2013-09-15T17:50:58.637 回答
1

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

sorted(data, key=lambda (a, b): (a-b, a), reverse=True)
于 2013-09-15T17:52:14.920 回答
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)]

当我对差异进行排序时,ab,结果如下:

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)]
于 2013-09-15T18:00:05.847 回答