如何遍历字典列表中的嵌套字典?

时间:2019-03-15 15:30:10

标签: python json

Python的新手,这里需要一点帮助。我找到了一些遍历词典列表的答案,但没有找到嵌套在词典列表中的嵌套字典的答案。

这是字典列表中单个字典的粗略结构

[{ 'a':'1',
'b':'2',
'c':'3',
'd':{ 'ab':'12',
      'cd':'34',
      'ef':'56'},
'e':'4',
'f':'etc...'
}]



dict_list = [{ 'a':'1', 'b':'2', 'c':'3', 'd':{ 'ab':'12','cd':'34', 'ef':'56'}, 'e':'4', 'f':'etc...'}, { 'a':'2', 'b':'3', 'c':'4', 'd':{ 'ab':'23','cd':'45', 'ef':'67'}, 'e':'5', 'f':'etcx2...'},{},........,{}]

这或多或少是我正在查看的内容,尽管有些键将列表作为值而不是字典,但我认为我现在不必担心它们,尽管可以捕捉到这些的代码会很棒。 / p>

到目前为止,这是我做的出色工作,它遍历json并返回每个“高级”键的所有值。

import ujson as json

with open('test.json', 'r') as f:
    json_text = f.read()

dict_list = json.loads(json_text)

for dic in dict_list:
    for val in dic.values():
        print(val)

这是该循环运行时返回的第一组值

1
2
3
{'ab':'12','cd':'34','ef':'56'}
4
etc...

我需要能够从顶层中选择特定的值,然后再深入一层,在该嵌套词典中获取特定的值,然后将其附加到列表中。我确定我缺少一个简单的解决方案。也许我正在看多个循环?

2 个答案:

答案 0 :(得分:4)

如何使用isinstance检查实例类型(当然仅适用于更深一层)。可能不是最好的方法

for dic in dict_list:
    for val in dic.values():
        if not isinstance(val, dict):
            print(val)
        else:    
            for val2 in val.values():
                print (val2)

# 1
# 2
# 3
# 12
# 34
# 56
# 4
# etc...
# 2
# 3

答案 1 :(得分:3)

遵循Python鼓励的ducktype样式,只需猜测所有内容都有一个.values成员,如果没有则捕获它:

import ujson as json

with open('test.json', 'r') as f:
    json_text = f.read()

dict_list = json.loads(json_text)

for dic in dict_list:
    for val in dic.values():
        try:
            for l2_val in val.values():
                print(l2_val)
        except AttributeError:
            print(val)

Bazingaa's解决方案如果内部字典预计很少见,将会更快。

当然,如果再“深入”,您可能需要进行一些递归:

def print_dict(d):
    for val in d.values():
       try:
           print_dict(val)
        except AttributeError:
           print(val)