如何递归地展开嵌套字典?

5

我本以为这个问题有一个简单的解决方案,但结果证明我错了。

我有一个嵌套字典:

my_dict = { "username": "myEmail@email.com",
  "name": { "first": "John", "last": "Doe" },
  "occupation": "Web Developer" }

我编写了一个递归函数,将其展开到现有字典中:
def adder(my_dict, existing_dict):
    for k, v in my_dict:
        if not isinstance(v, dict):
            existing_dict[k] = v
        else:
            adder(v.iteritems(), existing_dict)
    return existing_dict


existing_dict = { "role": "employee" }
adder(my_dict.iteritems(), existing_dict)

在循环中一切都进行得很顺利,直到我遇到递归,此时my_dict从字典变成了dictionary-itemiterator object at 0x07f6750086c00

我没有看到任何明显的错误,尽管看起来v.iteritems()会破坏一切(但循环仍然完成)。有什么想法吗?


为什么在递归调用中要调用 iteritems?递归调用将迭代器作为 my_dict。另一方面,遍历字典只会得到键,因此 for k, v in my_dict 需要调用 iteritems - user2357112
你需要处理任意层次的嵌套,还是只有一次?当内部键与外部键冲突时,你希望发生什么? - wim
@wim 只需要一次,我可以保证这些键不会发生冲突,至少对于这个小用例来说是这样的,尽管这是我未来需要考虑的事情。 - diplosaurus
1个回答

6

我同意上面的观点 - 仅迭代字典本身只迭代键。

此外,我认为您希望从函数返回existing_dict,而不是修改过的my_dict。另外,您希望将字典传回函数,而不是迭代器。

def adder(my_dict, existing_dict):
    for k, v in my_dict.iteritems():
        if not isinstance(v, dict):
            existing_dict[k] = v
        else:
            adder(v, existing_dict)
    return existing_dict

In [47]: adder(my_dict, existing_dict)
Out[47]: 
{'first': 'John',
 'last': 'Doe',
 'occupation': 'Web Developer',
 'role': 'employee',
 'username': 'myEmail@email.com'}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接