【问题标题】:Sort nested dictionary by inner values按内部值对嵌套字典进行排序
【发布时间】:2019-10-11 18:55:43
【问题描述】:

如何按内部值对这个嵌套字典进行排序。键将更改,因此无法按键排序。键是整数,值是浮点数。

NestedDict = {'1': {2: 0.3, 7: 0.5, 4: 0.4, 3: 0.75},
              '2': {5: 0.3, 7: 0.5, 4: 0.4, 1: 0.75},
              '3': {15: 0.3, 7: 0.5, 4: 0.4, 70: 0.75}}

这是我需要的结果。无论键如何,值都从最大到最小排序。

# NestedDict = {'1': {3: 0.75, 7: 0.5, 4: 0.4, 2: 0.3},
#               '2': {1: 0.75, 7: 0.5, 4: 0.4, 5: 0.3},
#               '3': {70: 0.75, 7: 0.5, 4: 0.4, 15: 0.3}}

【问题讨论】:

  • 已经看到那个帖子了。我的结构是一个嵌套的嵌套字典,而不仅仅是一个嵌套的字典。
  • 如您所见,键没有任何静态名称。
  • 等等,你是不是想得到一本“有序字典”?字典中键出现的顺序取决于插入顺序,我不确定它是否可以更改。您可能想使用OrderedDictdocs.python.org/3/library/…
  • 你用的是什么版本的 Python?

标签: python dictionary


【解决方案1】:

您可以使用字典推导以有序的方式重建字典。从 Python 3.7 开始,您将项目添加到字典的顺序被保留。

NestedDict = {
    outer_key: {
        inner_key: inner_value for inner_key, inner_value in
        sorted(inner_dict.items(), key=lambda d: -d[1])
    }
    for outer_key, inner_dict in NestedDict.items()
} 

现在NestedDict

{'1': {3: 0.75, 7: 0.5, 4: 0.4, 2: 0.3},
 '2': {1: 0.75, 7: 0.5, 4: 0.4, 5: 0.3},
 '3': {70: 0.75, 7: 0.5, 4: 0.4, 15: 0.3}}

外层是相同的,但对于内层,我们正在迭代内部字典的排序版本(按它们的值排序,由d[1] 给出,其中减号表示降序)。

【讨论】:

  • 谢谢。但恐怕我不知道如何实现上述内容,因为我刚刚尝试过。你介意把它提到的全部写下来吗?
  • @HelloWorld123 哦,我的意思是NestedDict = {outer_key: ... 我已经更新了答案。让我知道是否更清楚。
【解决方案2】:

字典推导式的替代方案。不一定更好,不同。这是基于 Python 3.6 或更高版本的,它维护插入顺序,否则必须使用OrderedDict。字典推导式为您提供该选项。

NestedDict = {'1': {2: 0.3, 7: 0.5, 4: 0.4, 3: 0.75},
              '2': {5: 0.3, 7: 0.5, 4: 0.4, 1: 0.75},
              '3': {15: 0.3, 7: 0.5, 4: 0.4, 70: 0.75}}

keys = [k for k in NestedDict.keys()]
dict_values = [v for v in NestedDict.values()]
dict_values = [dict(sorted(x.items(), key=lambda kv: -kv[1])) for x in dict_values] # or OrderedDict

NestedDict = dict(zip(keys, dict_values)) # or OrderedDict
print(NestedDict)

打印:

{'1': {3: 0.75, 7: 0.5, 4: 0.4, 2: 0.3}, '2': {1: 0.75, 7: 0.5, 4: 0.4, 5: 0.3}, '3': {70: 0.75, 7: 0.5, 4: 0.4, 15: 0.3}}

【讨论】:

    猜你喜欢
    • 2014-05-01
    • 1970-01-01
    • 2021-03-08
    • 2020-11-11
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    相关资源
    最近更新 更多