Error de la clave del diccionario de Python al asignar: ¿cómo puedo solucionar esto?

Tengo un diccionario que creo así:

myDict = {} 

Luego me gusta agregarle una clave que corresponda a otro diccionario, en el que pongo otro valor:

 myDict[2000]['hello'] = 50 

Así que cuando pase myDict[2000]['hello'] algún lugar, daría 50 .

¿Por qué Python no está creando esas entradas justo allí? ¿Cual es el problema? Pensé que KeyError solo ocurre cuando intentas leer una entrada que no existe, ¿pero la estoy creando aquí?

KeyError produce porque está intentando leer una clave inexistente cuando intenta acceder a myDict[2000] . Como alternativa, podrías usar defaultdict :

 >>> from collections import defaultdict >>> myDict = defaultdict(dict) >>> myDict[2000]['hello'] = 50 >>> myDict[2000] {'hello': 50} 

defaultdict(dict) significa que si myDict encuentra una clave desconocida, devolverá un valor predeterminado, en este caso lo que devuelva dict () que es un diccionario vacío.

Pero estás intentando leer una entrada que no existe: myDict[2000] .

La traducción exacta de lo que dices en tu código es “dame la entrada en myDict con la clave del 2000 y almacena 50 contra la clave ‘hola’ en esa entrada”. Pero myDict no tiene una clave de 2000, de ahí el error.

Lo que realmente necesitas hacer es crear esa clave. Puedes hacer eso de una sola vez:

 myDict[2000] = {'hello': 50} 

Lo que quieres es implementar un dict nested :

Recomiendo este enfoque:

 class Vividict(dict): def __missing__(self, key): value = self[key] = type(self)() return value 

De los documentos, bajo d[key]

Nuevo en la versión 2.5: si una subclase de dict define un método __missing__() , si la clave no está presente, la operación d [clave] llama a ese método con la clave clave como argumento

Intentarlo:

 myDict = Vividict() myDict[2000]['hello'] = 50 

y myDict ahora devuelve:

 {2000: {'hello': 50}} 

Y esto funcionará para cualquier profundidad arbitraria que desees:

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

solo funciona

Tienes razón, pero en tu código, python tiene que obtener primero myDict [2000] y luego hacer la tarea. Como esa entrada no existe, no se puede asignar a sus elementos.