展平嵌套字典并覆盖值

2024-09-27 18:02:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个嵌套字典,我想在覆盖重复键的值时将其展平。示例输入如下所示:

{
    'abc': 1,
    'foo': 2
    'cba': {'abc': 3, 'baz': {
        'foo': 4
    }}
}

目标是用较低级别dict中相同键的值覆盖最高级别dict中键的值,其中最低级别dict中的键起主导作用

输出需要是这样的:

{
    'abc': 3,
    'foo': 4,
    'cba': {'abc': 3, 'baz': {
        'foo': 4
    }}
}

我试图找到一个解决方案,所以,但找不到一个。。。希望有人能帮我:)


Tags: 示例目标字典foobaz解决方案级别dict
3条回答

你可能在找类似的东西

ndir = {
    'abc': 1,
    'foo': 2,
    'cba': {'abc': 3, 'baz': { 'foo': 4 }}
}

print(ndir)

res = {}
def GetContent(ndir):
  for k, v in ndir.items():
    if isinstance(v, dict):
      GetContent(v)
    else:
      res[k]=v

GetContent(ndir)
print(res)

下面的代码查找每个键的最大深度值,然后递归更新原始输入:

from collections import defaultdict
data = {'abc': 1, 'foo': 2, 'cba': {'abc': 3, 'baz': {'foo': 4}}}
def levels(d, c = 0):
   for a, b in d.items():
      yield from [(c, a, b)] if not isinstance(b, dict) else levels(b, c+1)

l = defaultdict(dict)
for _l, a, b in levels(data):
   l[a][_l] = b

def new_d(d):
   return {a:new_d(b) if isinstance(b, dict) else l[a][max(l[a])] for a, b in d.items()}

result = new_d(data)

输出:

{'abc': 3, 'foo': 4, 'cba': {'abc': 3, 'baz': {'foo': 4}}}

不确定这有多强大,但我想这就是你想要的(归功于https://stackoverflow.com/a/6027615/5417511):

import collections

d = {
    'abc': 1,
    'foo': 2,
    'cba': {'abc': 3, 'baz': {
        'foo': 4
    }}
}

def flatten(d):
    items = []
    for k, v in d.items():
        if isinstance(v, collections.MutableMapping):
            items.extend(flatten(v).items())
        else:
            items.append((k, v))
    return dict(items)

d.update(flatten(d))
print(d)
{'abc': 3, 'foo': 4, 'cba': {'abc': 3, 'baz': {'foo': 4}}}

相关问题 更多 >

    热门问题