Python 在深度嵌套的字典中查找键

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

我有很多嵌套字典,我试图找到嵌套在某个地方的某个键

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

只需遍历字典并检查键(注意底部关于“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)