【问题标题】:Sorting list of tuples of tuples元组的元组排序列表
【发布时间】:2017-02-04 04:08:33
【问题描述】:
[((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 进行排序...但是我无法按字母顺序排序,因为我需要按降序对列表进行排序如果数字相同,则按字母升序排列。

【问题讨论】:

  • sorted(li, key=lambda t: (-t[-1],t[0]))

标签: python python-3.x sorting


【解决方案1】:

使用元组作为排序键,浮点数为负数以反转顺序:

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

【讨论】:

  • 有一个很棒的overview 介绍如何在 Python 中进行排序。
【解决方案2】:

同样,您可以为 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)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 2011-07-25
    • 2014-05-11
    • 2021-09-11
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多