14

我构建了一个列表[[13, "b"], [10, "b"], [10, "a",], [4,"c"], [1, "d"]],该列表按两个元素列表中的第一个值排序。这是我能做的部分。我不知道如果两个元素相同,那么我想按字母顺序对其进行排序。我用来对第一个列表进行排序的方法是按第一个元素反转已排序的列表。然而,这会[10, "b"]出现在前面,[10, "a"]但我想要“a”在“b”之前。有没有办法按第一个元素按降序排序,如果平局,按第二个元素的字母顺序排序?

4

1 回答 1

18

这有效:

>>> li=[[13, "b"], [10, "b"], [10, "a",], [4,"c"], [1, "d"]]
>>> sorted(li,key=lambda sl: (-sl[0],sl[1]))
[[13, 'b'], [10, 'a'], [10, 'b'], [4, 'c'], [1, 'd']]

sorted 函数生成一个新列表。您还可以使用 sort 方法对列表进行适当的排序:

>>> li=[[13, "b"], [10, "b"], [10, "a",], [4,"c"], [1, "d"]]
>>> li.sort(key=lambda sl: (-sl[0],sl[1]))
>>> li
[[13, 'b'], [10, 'a'], [10, 'b'], [4, 'c'], [1, 'd']]

您还可以进行嵌套排序(或按一个键排序,然后按第二个键排序),因为 python 使用稳定的排序

>>> from operator import itemgetter
>>> li=[[13, "b"], [10, "b"], [10, "a",], [4,"c"], [1, "d"]]
>>> li.sort(key=itemgetter(1))
>>> li
[[10, 'a'], [13, 'b'], [10, 'b'], [4, 'c'], [1, 'd']]
>>> li.sort(key=itemgetter(0),reverse=True)
>>> li
[[13, 'b'], [10, 'a'], [10, 'b'], [4, 'c'], [1, 'd']]

由于在单元素排序中不需要 lambda,因此我使用了更快的operator.itemgetter与 lambda。两种更快的排序是否比一种更快,我不知道......您也可以对这种方法使用 lambda。

有一个很棒的排序教程展示了许多这些习语。

于 2013-07-26T21:16:30.007 回答