La respuesta depende de la frecuencia con la tecla ya está en el dict (Por cierto, ¿alguien ha mencionado a lo mal que una idea es ocultar una orden interna como dict
detrás de una variable?)
if key not in dct:
dct[key] = foo
Si la clave está en el diccionario, esta hace una búsqueda de diccionario. Si la clave está en el diccionario, busca el diccionario dos veces.
try:
dct[key]
except KeyError:
dct[key] = foo
Esto puede ser un poco más rápido para el caso en que la clave está en el diccionario, pero lanzar una excepción tiene todo un gran sobrecarga, por lo que no es casi siempre la mejor opción.
dct.setdefault(key, foo)
Ésta es un poco difícil: siempre implica dos búsquedas de diccionario: el primero es encontrar el método setdefault
en la clase dict
, la segunda es la búsqueda de key
en el objeto dct
. Además, si foo
es una expresión, se evaluará siempre, mientras que las opciones anteriores solo la evaluarán cuando sea necesario.
Consulte también collections.defaultdict
. Esa es la solución más adecuada para una gran clase de situaciones como esta.
También existe el método dict.setdefault: http://docs.python.org/release/2.6.6/library/stdtypes.html#mapping-types-dict – GWW
El primero ** no ** hace un lineal buscar Como dijo Larry Wall: "Hacer escaneos lineales sobre una matriz asociativa es como tratar de matar a alguien con una Uzi cargada". 'dict .__ contains__' hace aproximadamente lo mismo que los primeros 2/3 de' dict.__getitem__' (una búsqueda hash). – delnan
Esa es una gran cita. – nmichaels