Python 如何遍历嵌套的dict?

Python 如何遍历嵌套的dict?,python,dictionary,Python,Dictionary,我有一个嵌套的python字典数据结构。我想使用collection模块在不使用的情况下读取其键和值。数据结构如下所示 d = {'dict1': {'foo': 1, 'bar': 2}, 'dict2': {'baz': 3, 'quux': 4}} 我试着用下面的方法读字典里的键,但却出错了 代码 for key, value in d: print(Key) 错误 ValueError: too many values to unpack (expected 2) 因此,请

我有一个嵌套的
python字典
数据结构。我想使用
collection
模块在不使用
的情况下读取其键和值。数据结构如下所示

d = {'dict1': {'foo': 1, 'bar': 2}, 'dict2': {'baz': 3, 'quux': 4}}
我试着用下面的方法读字典里的键,但却出错了

代码

for key, value in d:
    print(Key)
错误

ValueError: too many values to unpack (expected 2)

因此,请任何人解释错误背后的原因,以及如何在字典中进行迭代

要获取键和值,您需要
dict.items()

如果您只需要钥匙:

for key in d:
    print(key)

反复浏览字典只会给你答案

您告诉python需要一组元组,它试图解包一些不是元组的东西(您的代码被设置为希望每个迭代项的形式为
(key,value)
,但事实并非如此(您只是在每次迭代中得到
key

您还试图打印
,这与
不同,这会导致
名称错误

for key in d:
    print(key)
应该可以工作。

keys()
方法返回一个视图对象,该对象显示字典中所有键的列表

迭代嵌套字典:

d = {'dict1': {'foo': 1, 'bar': 2}, 'dict2': {'baz': 3, 'quux': 4}}

for i in d.keys():
    print i
    for j in d[i].keys():
        print j
def get_all_keys(d):
    for key, value in d.items():
        yield key
        if isinstance(value, dict):
            yield from get_all_keys(value)


d = {'dict1': {'foo': 1, 'bar': 2}, 'dict2': {'dict3': {'baz': 3, 'quux': 4}}}
for x in get_all_keys(d):
    print(x)

输出:

dict1 
foo
bar

dict2
baz 
quux

其中,
i
迭代主字典键,
j
迭代嵌套字典键。

作为请求的输出,代码如下所示

    d = {'dict1': {'foo': 1, 'bar': 2}, 'dict2': {'baz': 3, 'quux': 4}}

    for k1,v1 in d.iteritems(): # the basic way
        temp = ""   
        temp+=k1
        for k2,v2 in v1.iteritems():
           temp = temp+" "+str(k2)+" "+str(v2)
        print temp
代替
iteritems()
您也可以使用
items()
,但是
iteritems()
更有效,并返回迭代器


希望这有帮助:)

您可以使用
benedict
(一个
dict
子类)和遍历实用方法:

安装:
pip安装python benedict

from benedict import benedict

d = benedict({'dict1': {'foo': 1, 'bar': 2}, 'dict2': {'baz': 3, 'quux': 4}})

def traverse_item(dct, key, value):
   print('key: {} - value: {}'.format(key, value))

d.traverse(traverse_item)
文件:


注意:我是这个项目的作者。

如果给定的字典模式的格式是单调的,并且键是已知的

dict_ = {'0': {'foo': 1, 'bar': 2}, '1': {'foo': 3, 'bar': 4}}
for key, val in dict_.items():
    if isinstance(val, dict):
        print(val.get('foo'))
        print(val.get('bar'))

在这种情况下,我们可以跳过嵌套循环

您可以如下迭代嵌套字典的所有键和值:

d = {'dict1': {'foo': 1, 'bar': 2}, 'dict2': {'baz': 3, 'quux': 4}}

for i in d:
    for j, k in d[i].items():
        print(j,"->", k)
您的输出如下所示-

foo -> 1
bar -> 2
baz -> 3
quux -> 4

以下内容适用于多层嵌套字典:

d = {'dict1': {'foo': 1, 'bar': 2}, 'dict2': {'baz': 3, 'quux': 4}}

for i in d.keys():
    print i
    for j in d[i].keys():
        print j
def get_all_keys(d):
    for key, value in d.items():
        yield key
        if isinstance(value, dict):
            yield from get_all_keys(value)


d = {'dict1': {'foo': 1, 'bar': 2}, 'dict2': {'dict3': {'baz': 3, 'quux': 4}}}
for x in get_all_keys(d):
    print(x)
这将为您提供:

dict1
foo
bar
dict2
dict3
baz
quux

是否也要读取嵌套的键和值?只需编写
d.items()
,默认情况下,迭代dict的名称将只返回键。希望能有所帮助对我想读取所有包含嵌套键的键和值values@Arijit发布了请求输出的答案,请看一看。此问题的一般答案在此处没有回答,但在其他地方得到了回答:对于python2,您可以选择
dict.iteritems()
,而对于此用例,它更快。这不是问题的答案“如何遍历嵌套dict”。Python 3不存在
iteritems
方法。