Ошибка ключа словаря Python при назначении - как мне обойти это?
у меня есть словарь, который я создам такой:
myDict = {}
тогда мне нравится добавлять в него ключ, соответствующий другому словарю, в который я помещаю другое значение:
myDict[2000]['hello'] = 50
поэтому, когда я прохожу мимо myDict[2000]['hello']
где-то, это дало бы 50
.
Почему Python просто не создает эти записи прямо там? В чем проблема? Я думал, что KeyError возникает только тогда, когда вы пытаетесь прочитать запись, которая не существует, но я создаю ее прямо здесь?
4 ответов
KeyError
происходит, потому что вы пытаетесь прочитать несуществующий ключ при попытке доступа myDict[2000]
. В качестве альтернативы вы можете использовать defaultdict:
>>> from collections import defaultdict
>>> myDict = defaultdict(dict)
>>> myDict[2000]['hello'] = 50
>>> myDict[2000]
{'hello': 50}
defaultdict(dict)
означает, что если myDict встретит неизвестный ключ, он вернет значение по умолчанию, в этом случае все, что возвращается dict (), который является пустым словарем.
а вы are попытка прочитать запись, которая не существует:myDict[2000]
.
точный перевод того, что вы говорите в своем коде: "дайте мне запись в myDict с ключом 2000 и сохраните 50 против ключа "привет" в этой записи."Но у myDict нет ключа 2000, отсюда и ошибка.
на самом деле вам нужно создать этот ключ. Вы можете сделать это за один раз:
myDict[2000] = {'hello': 50}
вы хотите реализовать вложенный dict:
Я рекомендую такой подход:
class Vividict(dict):
def __missing__(self, key):
value = self[key] = type(self)()
return value
из документов, под d[key]
чтобы попробовать это:
myDict = Vividict()
myDict[2000]['hello'] = 50
и myDict сейчас возвращает:
{2000: {'hello': 50}}
и это будет работать для любой произвольной глубины вы хотите:
myDict['foo']['bar']['baz']['quux']
просто работает.
вы правы, но в вашем коде python должен сначала получить myDict[2000], а затем выполнить задание. Поскольку эта запись не существует, она не может назначить своим элементам