Найти ключ внутри глубоко вложенного словаря - PullRequest
2 голосов
/ 26 марта 2010

У меня много вложенных словарей, я пытаюсь найти определенный ключ, вложенный где-то внутри.

например. этот ключ называется "фрукт". Как мне найти значение этого ключа?

Ответы [ 3 ]

5 голосов
/ 26 марта 2010

@ Рекурсивное решение Ховарда, вероятно, будет в порядке ... если уровень вложенности не слишком высок, и тогда вы получите 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.

2 голосов
/ 26 марта 2010

(Делая некоторые предположения о вашей структуре данных ...)

Сделать это рекурсивно:

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
0 голосов
/ 26 марта 2010

Просто просмотрите словарь и проверьте ключи (обратите внимание на комментарий внизу о значении «not found»).

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...