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