Mi intento de crear un diccionario de listas mediante programación no me permite abordar las claves del diccionario individualmente. Siempre que creo el diccionario de listas e intento agregar una clave, todas se actualizan. Aquí hay un caso de prueba muy simple:
data = {}
data = data.fromkeys(range(2),[])
data[1].append('hello')
print data
Resultado actual: {0: ['hello'], 1: ['hello']}
Resultado Esperado: {0: [], 1: ['hello']}
Esto es lo que funciona
data = {0:[],1:[]}
data[1].append('hello')
print data
Resultado real y esperado: {0: [], 1: ['hello']}
¿Por qué el fromkeys
método no funciona como se esperaba?
python
list
dictionary
Martin Burch
fuente
fuente
fromkeys()
método aceptara una función de fábrica en su lugar, por lo que podríamos pasarlist
como una función, y esa función se llamaría una vez por cada clave creada, pero esa no es la API real dedict.fromkeys()
.Utilice defaultdict en su lugar:
from collections import defaultdict data = defaultdict(list) data[1].append('hello')
De esta forma, no es necesario que inicialice todas las claves que desea utilizar en las listas de antemano.
Lo que está sucediendo en su ejemplo es que usa una lista (mutable):
alist = [1] data = dict.fromkeys(range(2), alist) alist.append(2) print data
saldría
{0: [1, 2], 1: [1, 2]}
.fuente
list
aquí no hay una lista vacía, sino un tipo (o puede verlo como un constructor invocable, supongo). Entonces, cada vez que se pasa una clave faltante, se crea una nueva lista en lugar de reutilizar la misma.Está completando sus diccionarios con referencias a una sola lista, por lo que cuando la actualiza, la actualización se refleja en todas las referencias. En su lugar, pruebe con la comprensión del diccionario. Consulte Crear un diccionario con comprensión de listas en Python.
d = {k : v for k in blah blah blah}
fuente
v
en esta respuesta?Podrías usar esto:
data[:1] = ['hello']
fuente