Sorting list of tuples of tuples

前端 未结 2 645
清酒与你
清酒与你 2020-12-07 06:33
[((D,A),0.0),((D,C),0.0),((D,E),0.5)]

I need to sort the list as:

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

I have us

相关标签:
2条回答
  • 2020-12-07 07:14

    Use a tuple as the sort key with a negative on the float to reverse the order:

    >>> 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)]
    

    If you cannot do negation (say on a string or letter value or something non numeric) then you can take advantage of the fact that the Python sort function is stable and do the sort in two steps:

    >>> 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 讨论(0)
  • 2020-12-07 07:14

    Similarly, you could supply sorted with an iterable that is the result of another 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)]
    
    0 讨论(0)
提交回复
热议问题