我正在尝试从data
中获取值,但是下面的函数总是给我无。我在循环中包含了print
,以便实际上可以看到该条件是正确的,而不知道为什么它返回None。但是打印出的值是正确的。
data = {
'test1': {
'test1.1': {
'a': 'a',
'b': 'b'
}
},
'test2': {
'test2.1': {
'test2.2': {
'c': 'c',
'd': 'd'
}
},
'test_list': [1,2,3]
}
}
def get_dict(key, dict_data):
for k, v in dict_data.items():
if k == key and isinstance(v, dict):
print(v)
return v
else:
if isinstance(v, dict):
return get_dict(key, v) # <-- added return, same result
get_dict('test1', data)
返回OK
get_dict('test1.1', data)
返回None
,但应该有{'a': 'a', 'b': 'b'}
get_dict('test2', data)
返回OK
get_dict('test2.1', data)
返回None
,但应返回{'test2.2': {'c': 'c', 'd': 'd'}}
答案 0 :(得分:3)
问题在于您永远都不会到达第二个键,因为两条路径都将在您的代码中返回,并且您在循环中永远不会获得多次迭代。您无需遍历字典项。只需尝试访问密钥即可。如果不存在,则循环遍历值并递归,返回找到的第一件事:
data = {
'test1': {
'test1.1': {
'a': 'a',
'b': 'b'
}
},
'test2': {
'test2.1': {
'test2.2': {
'c': 'c',
'd': 'd'
}
},
'test_list': [1,2,3]
}
}
def get_dict(key, dict_data):
if not isinstance(dict_data, dict):
return
try:
return dict_data[key]
except KeyError:
for v in dict_data.values():
found = get_dict(key, v)
if found:
return found
get_dict('test2.2', data)
# {'c': 'c', 'd': 'd'}
get_dict('test2.1', data)
# {'test2.2': {'c': 'c', 'd': 'd'}}
答案 1 :(得分:0)
您还应该继续研究其他命令。
下面的代码没有层次结构:
def get_dict(key, dict_data):
for k, v in dict_data.items():
if k == key and isinstance(v, dict):
return v
elif isinstance(v, dict):
ret = get_dict(key, v)
if ret is not None:
return ret
return None