在深层嵌套字典中查找密钥

时间:2010-03-26 10:57:22

标签: python dictionary nested

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

e.g。这把钥匙叫做“水果”。如何找到此密钥的值?

4 个答案:

答案 0 :(得分:5)

@Håvard的递归解决方案可能没问题......除非嵌套级别太高,然后你得到RuntimeError: maximum recursion depth exceeded。为了解决这个问题,你可以使用通常的技术进行递归删除:保持自己的一堆项目进行检查(作为一个在你控制之下的列表)。即:

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)

这里的逻辑非常接近递归的答案(除了以正确的方式检查dict ;-),明显的例外是递归调用被while循环替换显式堆栈列表.pop上的.appendstack操作。

答案 1 :(得分:2)

(对您的数据结构进行一些猜测......)

递归地执行:

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

答案 2 :(得分:0)

只需遍历字典并检查密钥(请注意底部有关“未找到”值的评论)。

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

答案 3 :(得分:0)

将近 11 年后...基于 Alex Martelli answer 稍作修改,适用于 Python 3 和列表:

def find_key_nonrecursive(adict, key):
    stack = [adict]
    while stack:
        d = stack.pop()
        if key in d:
            return d[key]
        for v in d.values():
            if isinstance(v, dict):
                stack.append(v)
            if isinstance(v, list):
                stack += v