Ошибка ключа словаря 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]

New в версии 2.5: если подкласс dict определяет метод __missing__(), если ключ key нет, Г[ключ] операция вызывает этот метод с ключом key в качестве аргумента

чтобы попробовать это:

myDict = Vividict()

myDict[2000]['hello'] = 50

и myDict сейчас возвращает:

{2000: {'hello': 50}}

и это будет работать для любой произвольной глубины вы хотите:

myDict['foo']['bar']['baz']['quux']

просто работает.


вы правы, но в вашем коде python должен сначала получить myDict[2000], а затем выполнить задание. Поскольку эта запись не существует, она не может назначить своим элементам