如何迭代嵌套的字典?

Ari*_*nda 10 python dictionary

我有一个嵌套的python dictionary数据结构.我想withoutcollection模块读取它的键和值.数据结构如下所示.

d = {'dict1': {'foo': 1, 'bar': 2}, 'dict2': {'baz': 3, 'quux': 4}}
Run Code Online (Sandbox Code Playgroud)

我试图使用波纹管方式读取字典中的键但得到错误.

for key, value in d:
    print(Key)
Run Code Online (Sandbox Code Playgroud)

错误

ValueError: too many values to unpack (expected 2)
Run Code Online (Sandbox Code Playgroud)

所以任何人都可以解释错误背后的原因以及如何遍历字典.

0x0*_*0x0 36

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

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)
Run Code Online (Sandbox Code Playgroud)

这会给你:

dict1
foo
bar
dict2
dict3
baz
quux
Run Code Online (Sandbox Code Playgroud)

  • 递归确实可以为您节省大量时间,无需为嵌套字典的每个级别手动指定逻辑 (2认同)

Sun*_*lla 8

作为请求的输出,代码是这样的

    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
Run Code Online (Sandbox Code Playgroud)

代替iteritems()你也可以使用items(),但iteritems()效率更高并返回迭代器.

希望这可以帮助 :)

  • “ iteritems”方法在Python 3中不存在。 (3认同)

bha*_*atk 7

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
Run Code Online (Sandbox Code Playgroud)

要么

for i in d:
    print i
    for j in d[i]:
        print j
Run Code Online (Sandbox Code Playgroud)

输出:

dict1 
foo
bar

dict2
baz 
quux
Run Code Online (Sandbox Code Playgroud)

在其中i迭代主字典键并j迭代嵌套的字典键。


小智 6

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

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)
Run Code Online (Sandbox Code Playgroud)

你的输出看起来像这样 -

foo -> 1
bar -> 2
baz -> 3
quux -> 4
Run Code Online (Sandbox Code Playgroud)


Ste*_*uch 5

获取您需要的密钥和值dict.items():

for key, value in d.items():
    print(key)
Run Code Online (Sandbox Code Playgroud)

如果你只想要钥匙:

for key in d:
    print(key)
Run Code Online (Sandbox Code Playgroud)

  • 这不是对“如何遍历嵌套字典”的答案。 (5认同)
  • 对于python2,你可能更喜欢`dict.iteritems()`,这个用例更快. (3认同)