按First元素对元素列表进行排序,但如果按第二个元素进行等级排序

时间:2013-07-26 21:13:18

标签: python

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

1 个答案:

答案 0 :(得分:10)

这有效:

>>> 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 function生成一个新列表。您还可以使用排序方法对列表进行排序:

>>> 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使用stable sort

>>> 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 vs lambda。两个更快的排序是否比一个更快,我不知道...你也可以使用lambda这个方法。

有一个很棒的sort tutorial显示了许多这些习语。