Tengo un diccionario vacio Nombre: dict_x
es tener claves cuyos valores son listas.
De una iteración separada, obtengo una clave (ej .:) key_123
y un elemento (una tupla) para colocar en la lista del dict_x
valor de key_123
.
Si esta clave ya existe, quiero agregar este elemento. Si esta clave no existe, quiero crearla con una lista vacía y luego agregarla o simplemente crearla con una tupla.
En el futuro, cuando vuelva a aparecer esta clave, ya que existe, quiero que el valor se agregue nuevamente.
Mi código consiste en esto:
Obtenga clave y valor.
Vea si la clave NO existe en
dict_x
.y si no lo creas:
dict_x[key] == []
Después:
dict_x[key].append(value)
¿Es esta la manera de hacerlo? ¿Debo tratar de usar try/except
bloques?
dict_x[key] = [some_value] if not dict_x.has_key(key) else dict_x[key] + [some_value]
pero esta respuesta sugiere una forma mucho mejor. De hecho, se poneset()
como argumento y le permite utilizar eladd()
método ...Estas son las diversas formas de hacer esto para que pueda comparar cómo se ve y elegir lo que le gusta. Los ordené de una manera que creo que es más "pitónica" , y comenté los pros y los contras que podrían no ser obvios a primera vista:
Utilizando
collections.defaultdict
:Pros: Probablemente el mejor rendimiento. Contras: No disponible en Python 2.4.x.
Utilizando
dict().setdefault()
:Contras: Creación ineficiente de
list()
s no utilizados .Utilizando
try ... except
:O:
fuente
.setdefault()
crea diccionarios innecesarios. Creo que estoy creandolist
s innecesarios[]
en el segundo argumento de.setdefault()
que nunca se usa sikey
ya existe. Podría usardict.setdefault()
(en beneficio del hashing de claves eficiente), y usar una variable para reutilizarlist
s no utilizados , pero eso agrega algunas líneas más de código..setdefault
crea una búsqueda de clave donde la ausencia dedict
resultados dará como resultado unKeyError
tiempocollections.defaultdict(list)
crea unadict
búsqueda de clave donde la ausencia insertará unlist
Puedes usar un defaultdict para esto.
Esto es un poco más eficiente que
setdefault
porque no terminas creando nuevas listas que no terminas usando. Cada llamada asetdefault
va a crear una nueva lista, incluso si el elemento ya existe en el diccionario.fuente
Puedes usar defaultdict en
collections
.Un ejemplo de doc:
fuente
fuente
dict.get
).