我有很多嵌套字典,我试图在某处找到嵌套的某个键。
e.g。这把钥匙叫做“水果”。如何找到此密钥的值?
答案 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
上的.append
和stack
操作。
答案 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