Pythoni c способ получить один уровень из вложенного словаря - PullRequest
2 голосов
/ 12 июля 2020

Я пытаюсь извлечь один уровень из вложенного словаря. Так, например, учитывая приведенный ниже словарь, я ожидал бы увидеть следующие результаты для первого и второго уровня.

nested_dict = {
  'foo':'bar',
  'baz':{
    'foo':'baz'
  }}

# level 0
{'foo':'bar'}

# level 1
{'foo':'baz'}

Я могу получить первый уровень, используя dict понимание:

{k:v for (k,v) in nested_dict.items() if type(v) is not dict}
>>> {'foo':'bar'}

Или получить указанный уровень с помощью рекурсии:

def get_level(nested_dict, level):
  if level == 0:
    return {k:v for (k,v) in nested_dict.items() if type(v) is not dict}
  else:
    this_level = {}
    for (k,v) in nested_dict.items():
      if type(v) is dict:
        this_level.update(v)
    return get_level(this_level, level - 1)

get_level(nested_dict, 1)
>>> {'foo':'baz'}

Теперь мне интересно, есть ли более Pythonic / clean / нестандартный способ получения уровней вложенных словарей (как Я уже делал выше), при необходимости с помощью пакета.

1 Ответ

1 голос
/ 12 июля 2020

Как указано в комментариях, я предполагаю, что у вас нет дубликатов:

nested_dict = {
  'foo':'bar',
  'baz':{
    'foo':'baz',
    'fee': {
        'foo': 'fee'
    }
  },
  'baz2':{
    'foo2':'baz2'
  }
  }

def get_level(dct, level):
    if level == 0:
        yield from ((k, v) for k, v in dct.items() if not isinstance(v, dict))
    else:
        yield from ((kk, vv) for v in dct.values() if isinstance(v, dict) for kk, vv in get_level(v, level-1))


print(dict(get_level(nested_dict, 1)))

Печать:

{'foo': 'baz', 'foo2': 'baz2'}
print(dict(get_level(nested_dict, 2)))

Печать:

{'foo': 'fee'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...