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)