@ Рекурсивное решение Ховарда, вероятно, будет в порядке ... если уровень вложенности не слишком высок, и тогда вы получите RuntimeError: maximum recursion depth exceeded
. Чтобы исправить это, вы можете использовать обычную технику для удаления рекурсии: оставьте свой собственный набор предметов для проверки (как список, который находится под вашим контролем). I.e.:
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
.