【问题标题】:Sort a dict according to both key and value at the same time [duplicate]同时根据键和值对字典进行排序[重复]
【发布时间】:2021-09-02 14:53:52
【问题描述】:

我有一个看起来像这样的字典:

{0: 2, 1: 4, 2: 2, 3: 2, 4: 5}

即键和值都是整数。

我需要这样排序这个字典:

  • 按值优先,升序;
  • 按键,如果值相同,则降序。

我只知道 python 的 sorted() 函数支持一个名为“key”的参数,但它似乎只允许同时拥有 key 或 value。

我可以做些什么来实现?

仅供参考,结果应该是这样的:

{2: 2, 0: 2, 3: 2, 1: 4, 4: 5}

【问题讨论】:

  • 并非所有字典都可以排序。
  • 字典无法真正排序,但从 3.6 开始,它们保留了插入顺序:stackoverflow.com/a/613218/13892264
  • 为什么需要这样看?字典显示为最适合其结构。
  • @PeterWood:因为?
  • @ScottHunter 如果他们需要以特定顺序遍历字典,那么他们可以先对键进行排序。出于调试目的以外的任何目的显示字典结构是一个奇怪的请求。

标签: python sorting dictionary


【解决方案1】:

没有一种简单的方法可以说“这个值,升序,然后这个值,降序”。但是,如果您对整数列表中的每一个取反,然后对其进行排序,那么这与反向排序相同。

这定义了一个排序键,它是一个元组:

  • 第一个值是每个 dict 项的值。
  • 第二个值是每个 dict 项的键,但取反。
d = {0: 2, 2: 2, 3: 2, 1: 4, 4: 5}


def sort_key(item):
    key, value = item
    return value, -key


print(sorted(d.items(), key=sort_key))

这个输出:

[(3, 2), (2, 2), (0, 2), (1, 4), (4, 5)]

看到了吗?这些项目按值分组,如果出现平局,则按降序排列。

【讨论】:

    【解决方案2】:

    How do I sort a dictionary by value?

    data = {0: 2, 1: 4, 2: 2, 3: 2, 4: 5}
    sorted_data = dict(sorted(data.items(), key=lambda item:item[1]))
    print(sorted_data)
    

    输出

    {0: 2, 2: 2, 3: 2, 1: 4, 4: 5}
    

    【讨论】:

    • OP 要求按值 then 键排序。
    【解决方案3】:

    字典无法真正排序,但从 3.6 开始,它们保留了插入顺序,因此您可以根据前一个字典的已排序元组项创建新字典。

    要得到你想要的,你必须这样做两次——一次是按键,然后是值。 之所以可行,是因为 python 的 sorted 保证是“稳定的”——如果两个项目相同,则不会更改它们,因此如果两个值匹配,第二个值排序将保留初始键排序。

    input_dictionary = {0: 2, 1: 4, 2: 2, 3: 2, 4: 5}
    sorted_by_key = dict(sorted(input_dictionary.items(), key=lambda x: x[0], reverse=True))
    sorted_by_both = dict(sorted(sorted_by_key.items(), key=lambda x: x[1]))
    print(sorted_by_both)
    

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2011-12-11
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多