Как я могу заставить Python автоматически создавать недостающие пары ключ/значение в словаре?
Я создаю структуру словаря, которая имеет несколько уровней. Я пытаюсь сделать что-то вроде следующего:
dict = {}
dict['a']['b'] = True
В настоящий момент выше не выполняется, потому что ключ 'a' не существует. На данный момент мне нужно проверить на каждом уровне вложенности и вручную вставить пустой словарь. Есть ли какой-то тип синтаксического сахара, который может сделать что-то вроде выше, может произвести:
{'a': {'b': True}}
Не нужно создавать пустой словарь на каждом уровне вложенности?
Ответы
Ответ 1
Как говорили другие, используйте defaultdict
. Это идиома, которую я предпочитаю для произвольно-глубокого вложения словарей:
nested_dict = lambda: collections.defaultdict(nested_dict)
d = nested_dict()
d[1][2][3] = 'Hello, dictionary!'
print(d[1][2][3]) # Prints Hello, dictionary!
Это также позволяет проверить, существует ли элемент еще немного, поскольку вам больше не нужно использовать get
:
if not d[2][3][4][5]:
print('That element is empty!')
Ответ 2
Используйте defaultdict
.
Python: defaultdict defaultdict?
Ответ 3
Или вы можете это сделать, поскольку функция dict()
может обрабатывать **kwargs
:
http://docs.python.org/2/library/functions.html#func-dict
print dict(a=dict(b=True))
# {'a': {'b' : True}}
Ответ 4
Если глубина вашей структуры данных исправлена (то есть вы заранее знаете, что вам нужно mydict[a][b][c]
, но не mydict[a][b][c][d]
), вы можете создать вложенную структуру defaultdict с использованием выражений lambda
для создания внутренних структур
two_level = defaultdict(dict)
three_level = defaultdict(lambda: defaultdict(dict))
four_level = defaultdict(lamda: defaultdict(lambda: defaultdict(dict)))