在深层嵌套字典中查找键

2 投票
5 回答
3045 浏览
提问于 2025-04-15 20:53

我有很多层嵌套的字典,我想找到某个特定的键,它藏在某个地方。

比如,这个键叫做“fruit”。我该怎么找到这个键的值呢?

5 个回答

1

差不多过了11年……根据 Alex Martelli回答,稍微做了一些修改,适用于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
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
6

@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 循环,以及对这个显式栈列表 stack.pop.append 操作。

撰写回答