我正在尝试编写一个非常简单的函数来递归地搜索可能嵌套的(在最极端的情况下是十层深) Python字典,并返回它从给定键中找到的第一个值。
我不明白为什么我的代码不适用于嵌套字典。
def _finditem(obj, key):
if key in obj: return obj[key]
for k, v in obj.items():
if isinstance(v,dict):
_finditem(v, key)
print _finditem({"B":{"A":2}},"A")
它返回None
。
但是,它确实适用于返回2
的_finditem({"B":1,"A":2},"A")
。
我确定这是一个简单的错误,但我找不到。我觉得在标准库或collections
中可能已经有了这方面的东西,但我也找不到。
发布于 2013-02-20 00:30:34
当您递归时,需要对_finditem
的结果执行return
def _finditem(obj, key):
if key in obj: return obj[key]
for k, v in obj.items():
if isinstance(v,dict):
return _finditem(v, key) #added return statement
要修复实际的算法,您需要认识到,如果没有找到任何内容,_finditem
将返回None
,因此您需要显式检查以防止提前返回:
def _finditem(obj, key):
if key in obj: return obj[key]
for k, v in obj.items():
if isinstance(v,dict):
item = _finditem(v, key)
if item is not None:
return item
当然,如果您的任何字典中都有None
值,那么这将失败。在这种情况下,您可以为这个函数设置一个标记object()
,并在没有找到任何东西的情况下返回它--然后可以检查sentinel
,以了解您是否找到了什么东西。
发布于 2013-11-28 07:06:02
这是一个搜索包含嵌套字典和列表的字典的函数。它会创建一个结果值列表。
def get_recursively(search_dict, field):
"""
Takes a dict with nested lists and dicts,
and searches all dicts for a key of the field
provided.
"""
fields_found = []
for key, value in search_dict.iteritems():
if key == field:
fields_found.append(value)
elif isinstance(value, dict):
results = get_recursively(value, field)
for result in results:
fields_found.append(result)
elif isinstance(value, list):
for item in value:
if isinstance(item, dict):
more_results = get_recursively(item, field)
for another_result in more_results:
fields_found.append(another_result)
return fields_found
发布于 2017-04-03 20:37:09
下面是一个使用“堆栈”和"stack of iterators" pattern (归功于Gareth Rees)的方法:
def search(d, key, default=None):
"""Return a value corresponding to the specified key in the (possibly
nested) dictionary d. If there is no item with that key, return
default.
"""
stack = [iter(d.items())]
while stack:
for k, v in stack[-1]:
if isinstance(v, dict):
stack.append(iter(v.items()))
break
elif k == key:
return v
else:
stack.pop()
return default
print(search({"B": {"A": 2}}, "A"))
将打印2
。
https://stackoverflow.com/questions/14962485
复制相似问题