Python 在深度嵌套的字典中查找键
我有很多嵌套字典,我试图找到嵌套在某个地方的某个键 e、 这把钥匙叫做“水果”。如何找到该键的值?(对您的数据结构进行一些疯狂的猜测…) 以递归方式执行:Python 在深度嵌套的字典中查找键,python,dictionary,nested,Python,Dictionary,Nested,我有很多嵌套字典,我试图找到嵌套在某个地方的某个键 e、 这把钥匙叫做“水果”。如何找到该键的值?(对您的数据结构进行一些疯狂的猜测…) 以递归方式执行: def findkey(d, key): if key in d: return d[key] for k,subdict in d.iteritems(): val = findkey(subdict, key) if val: return val 只需遍历字典并检查键(注意底部关于“no
def findkey(d, key):
if key in d: return d[key]
for k,subdict in d.iteritems():
val = findkey(subdict, key)
if val: return val
只需遍历字典并检查键(注意底部关于“notfound”值的注释)
@Håvard的递归解决方案可能不会有问题。。。除非嵌套级别太高,然后会出现
运行时错误:超过最大递归深度。为了解决这个问题,您可以使用常见的递归移除技术:保留您自己要检查的项目堆栈(作为您控制下的列表)。即:
这里的逻辑与递归答案非常接近(除了以正确的方式检查dict
;-),但明显的例外是递归调用被替换为while
循环和.pop
和.append
显式堆栈列表上的操作,stack
差不多11年后。。。基于,稍加修改,对于Python 3和列表:
def find_key_非递归(adict,key):
堆栈=[adict]
堆栈时:
d=stack.pop()
如果输入d:
返回d[键]
对于d中的v值():
如果存在(v,dict):
stack.append(v)
如果存在(v,列表):
堆栈+=v
遍历字典并检查键这不是检查对象类型的方法@jathanism:还有其他可能使用递归函数的方法吗?嗯。。。您不应该使用(v,dict)
实例而不是类型(v)
是dict
?前者不接受dict的子类。此外,如果您检查是否存在\uuuu contains\uuu
,则您的代码还将接受支持“in”运算符的其他对象,而不仅仅是dicts。@Tamás您也可以使用isinstance()
,是的。然而,在这种情况下,dict是一个给定的参数。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,你知道最大递归深度是多少吗?据我所知,它必须嵌套至少100深,但我不能完全确定。@Goose-buffer:import-sys;sys.getrecursionlimit()
。另外,sys.setrecursionlimit()
@gorsky:谢谢!对于每个人来说,我的计算机上的递归限制是1000。
def find_key_recursive(d, key):
if key in d:
return d[key]
for k, v in d.iteritems():
if type(v) is dict: # Only recurse if we hit a dict value
value = find_key_recursive(v, key)
if value:
return value
# You may want to return something else than the implicit None here (and change the tests above) if None is an expected value
def find_key_nonrecursive(adict, key):
stack = [adict]
while stack:
d = stack.pop()
if key in d:
return d[key]
for k, v in d.iteritems():
if isinstance(v, dict):
stack.append(v)