我编写了一个递归函数来查找给定dict
和key
的值。
但我认为应该有一个更易读的版本。这是代码块。
def findvalue(_dict, target):
for key, values in _dict.items():
if 'dict' in str(type(values)):
return findvalue(values, target)
elif key == target:
return values
else:
print("no such key")
是否有任何一行版本或使用yield(对此不确定)?
修改:基于Recursive functions and lists appending/extending和评论中的想法,我修改了函数以按给定键查找所有匹配的值
def find_all_value(_dict, target, values=None):
for key, values in _dict.items():
#case 1: it is a dictionary but not match the key
if isinstance(values, dict) and key!=target:
return find_all_value(values, target)
#case 2: it is a dictionary but match the key -> put it in result
elif isinstance(values, dict) and key==target:
return [values] + find_all_value(values, target)
#case 3: it is not dictionary and match the key -> put it in result
elif key==target:
return [values]
答案 0 :(得分:2)
查找递归python dictionnary的第一个键(在广度优先搜索中找到)的值。
你可以这样做:
<meta charset="utf-8">
示例:
def find_value(_dict, key):
stack = [(None, _dict)]
while len(stack) != 0:
_key, val = stack.pop(0)
if val is not _dict and _key == key:
return val
if isinstance(val, dict):
for k, v in val.items():
stack.append((k, v))
输出:
d = {'c': {'d': 3, 'e': 4}, None: 0, 'b': 2, 'a': 1}
print('None:', find_value(d, None))
print('c:', find_value(d, 'c'))
print('e:', find_value(d, 'e'))
print('a:', find_value(d, 'a'))
答案 1 :(得分:0)
通过列表理解递归搜索(嵌套)字典:
def findvalue(d, key):
l = [e for e in [findvalue(e, key) for e in [d[k] for k in d.keys() if type(d[k])==dict]] if e]
l.append(d[key]) if key in d else l
return l
^返回(嵌套)每个匹配(嵌套)dict键的值列表。
简化版本打印而不是返回每个匹配:
def findvalue(d, key):
[findvalue(e, key) for e in [d[k] for k in d.keys() if type(d[k])==dict]]
if key in d: print(d[key])
^只显示每个匹配键的值
遇到了。
使用以下方式进行测试:
d = {1:2, 3:4, 5:{6:7,8:9, 99:{100:101}}, 10:11}
<击>
def findvalue(dict,key,target):
如果dict [key] == target:返回True
返回False
测试它:
dict = {1:2,3:4}
findvalue(dict,3,4)
击> <击> 撞击>