如何递归扁平化嵌套字典?

5 投票
1 回答
4865 浏览
提问于 2025-04-18 08:30

我以为我找到了这个问题的简单解决办法,但结果发现我错了。

我有一个嵌套的字典:

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() 让一切都乱了(但循环还是完成了)。有什么想法吗?

1 个回答

6

我同意上面的说法——直接遍历字典的话,只会遍历到键。

另外,我觉得你应该从函数中返回现有的字典,因为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'}

撰写回答