如何使用关键参数(非cmp)对混合顺序中的2个元素字符串元组进行排序

dav*_*off 6 python sorting python-3.x

在Python中,我有类似以下内容(虽然随机改组):

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

如果我打电话sorted(l),我得到一个排序结果(如上所述),这是人们所期望的.不过,我需要的是那种转发的第一个元组的元素和对排序反向第二元素.换句话说,我想得到以下结果:

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

在Python2.x中,存在一个cmp可以传递sorted()给实现此结果的参数,但Python3不再具有此功能.它只有一个key参数.有没有办法只使用key参数来实现所需的排序顺序?

我知道我可以定义一个全新的类来包装我的元组,或者使用类似的东西functools.cmp_to_key(也创建一个包装类),但这对于这样一个简单的操作来说似乎都很重要.没有其他办法吗?

编辑:我应该补充一点,字符串不会都是单字符串,在某些情况下,元组列表包含非字符串数据[ie(basestring,datetime)].

ovg*_*vin 12

从Python 2.2开始,Python中的排序是稳定的.

因此,您可以先使用反向标志按第二个值排序:

>>> from operator import itemgetter
>>> l.sort(key=itemgetter(1), reverse=True)
>>> l
[('a', 'z'), ('b', 'z'), ('a', 'y'), ('b', 'y'), ('a', 'x'), ('b', 'x')]
Run Code Online (Sandbox Code Playgroud)

然后你可以按第一个值排序:

>>> l.sort(key=itemgetter(0))
>>> l
[('a', 'z'), ('a', 'y'), ('a', 'x'), ('b', 'z'), ('b', 'y'), ('b', 'x')]
Run Code Online (Sandbox Code Playgroud)