【问题标题】:Sort a dictionary in python by values but maintaining the key order for equal values按值对python中的字典进行排序,但保持相等值的键顺序
【发布时间】:2014-09-18 06:29:31
【问题描述】:

假设有一本字典

d = {"P1":77,"P2":89,"P3":77}

我想以下面的形式打印结果

P2:89

P1:77

P3:77

即按字典值排序,对于相等的值,第一个在前(即 P1 在 P3 之前)

我做了以下

import collections
od = collections.OrderedDict(sorted(d.items(), key=lambda x:x[1], reverse=True))

给了

OrderedDict([('P2', 89), ('P3', 77), ('P1', 77)])

如何在 P3 之前获得 P1?

【问题讨论】:

  • 您的问题的前提是字典本身保持顺序,这是不正确的。对于要排序的键,您需要从一开始就使用ordereddict
  • 我认为你是对的......这样就可以了
  • 您可能希望使用排序集合recipe 来维护排序集合,而不是不断地使用新元素进行排序。

标签: python sorting python-2.7 dictionary


【解决方案1】:

这样做:

od = collections.OrderedDict(sorted(d.items(), key = lambda x:(-x[1],x[0])))

正如@Padraic 所说,“你不能从高到低,从低到高排序。”因此,您必须欺骗 sorted 函数,使其将最高数字视为最低数字。它按键的自然顺序进行子排序。

【讨论】:

    【解决方案2】:

    Python 的sort 是一种稳定 排序,这意味着如果它们比较相等,则项目将保持其原始顺序。如果您以OrderedDict 开头并仅对值进行排序,则它们的键将保持其原始顺序。但是,在您的情况下,请使用直接从高到低排序的键对它们进行排序,而不是颠倒排序,以使它们保持相同的键顺序。

    示例

    from collections import OrderedDict
    d = OrderedDict([('P1',77),('P2',89),('P3',77)])
    print sorted(d.items(),key=lambda x:-x[1])
    d = OrderedDict([('P3',77),('P2',89),('P1',77)])
    print sorted(d.items(),key=lambda x:-x[1])
    

    输出

    [('P2', 89), ('P1', 77), ('P3', 77)]
    [('P2', 89), ('P3', 77), ('P1', 77)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-06
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2021-04-13
      相关资源
      最近更新 更多