在深层嵌套字典中查找键
我有很多层嵌套的字典,我想找到某个特定的键,它藏在某个地方。
比如,这个键叫做“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
操作。