2016-09-26 104 views
-1
[((D,A),0.0),((D,C),0.0),((D,E),0.5)] 

我需要对列表进行排序为:排序元组的元组的列表

[((D,E),0.5),((D,A),0.0),((D,C),0.0)] 

我已经使用了sorted()功能,我能够基于价值观0.5, 0.0排序......但我不能够按字母顺序排序,因为如果数字具有相同的值,我需要按照数字降序排列列表并按字母升序排序。

+1

'sorted(li,key = lambda t:(-t [-1],t [0]))' – dawg

回答

2

使用一个元组的排序键带有负上浮子颠倒顺序:

>>> li=[(('D','A'),0.0),(('D','C'),0.0),(('D','E'),0.5)] 
>>> sorted(li, key=lambda t: (-t[-1],t[0])) 
[(('D', 'E'), 0.5), (('D', 'A'), 0.0), (('D', 'C'), 0.0)] 

如果你不能做否定(一个字符串或字母值或东西的非数字表示),那么你可以利用一个事实,即Python的排序功能是稳定的,并做排序分为两步:

>>> li=[(('D','A'),'A'),(('D','C'),'A'),(('D','E'),'C')] 
>>> sorted(sorted(li), key=lambda t: t[-1], reverse=True) 
[(('D', 'E'), 'C'), (('D', 'A'), 'A'), (('D', 'C'), 'A')] 
+0

Nice and Nifty code !!!!非常感谢@dawg –

+0

关于如何在Python中排序,有一个很棒的[概述](https://wiki.python.org/moin/HowTo/Sorting)。 – dawg

1

同样,你可以用一个迭代提供sorted那就是另一sort结果:

>>> from operator import itemgetter 
>>> t = [(('D','A'),0.0),(('D','C'),0.0),(('D','E'),0.5)] 
>>> sorted(sorted(t), key=itemgetter(1), reverse=True) 
[(('D', 'E'), 0.5), (('D', 'A'), 0.0), (('D', 'C'), 0.0)]