使用多个属性对列表进行排序的pythonic方法是什么,这样第一个是反向排序但第二个不是?

xuh*_*dev 1 python sorting

给出一个清单

[ ['a','b'], ['x','y'], ['a','y'], ['x', 'b'] ]
Run Code Online (Sandbox Code Playgroud)

如何以第一个元素逐渐排序的方式对其进行排序,但是当第一个元素相等时,第二个元素的排序越来越多?该列表中的字符串可以任意长.

排序列表应该是

[ ['x', 'b'], ['x', 'y'], ['a', 'b'], ['a', 'y'] ]
Run Code Online (Sandbox Code Playgroud)

我正在考虑使用一个单一的调用sorted,但编写一个反映这一点的关键似乎无法正常工作.

Tig*_*kT3 7

你可以对它进行两次排序(Python使用一个稳定的排序,在已排序的部分上表现良好):

>>> l = [ ['a','b'], ['x','y'], ['a','y'], ['x', 'b'] ]
>>> sorted(sorted(l, key=lambda x: x[1]), key=lambda x: x[0], reverse=True)
[['x', 'b'], ['x', 'y'], ['a', 'b'], ['a', 'y']]
Run Code Online (Sandbox Code Playgroud)

或者您可以使用ord()获取整数并取消它:

>>> l = [ ['a','b'], ['x','y'], ['a','y'], ['x', 'b'] ]
>>> sorted(l, key=lambda x: (-ord(x[0]), x[1]))
[['x', 'b'], ['x', 'y'], ['a', 'b'], ['a', 'y']]
Run Code Online (Sandbox Code Playgroud)