¿Cómo inicializo un diccionario de listas vacías en Python?

Mi bash de crear un diccionario de listas mediante progtwigción no me permite direccionar las claves del diccionario individualmente. Cada vez que creo el diccionario de listas e bash agregar una tecla, todas se actualizan. Aquí hay un caso de prueba muy simple:

data = {} data = data.fromkeys(range(2),[]) data[1].append('hello') print data 

Resultado real: {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 método fromkeys no funciona como se esperaba?

Al pasar [] como segundo argumento a dict.fromkeys() obtiene un resultado bastante inútil: todos los valores en el diccionario serán el mismo objeto de la lista.

En Python 2.7 o superior, puedes usar una comprensión dicitoneal en su lugar:

 data = {k: [] for k in range(2)} 

En versiones anteriores de Python, puedes usar

 data = dict((k, []) for k in range(2)) 

Utilice defaultdict en su lugar:

 from collections import defaultdict data = defaultdict(list) data[1].append('hello') 

De esta manera, no tiene que inicializar todas las claves que desea usar 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 

generaría {0: [1, 2], 1: [1, 2]} .

Está rellenando sus diccionarios con referencias a una sola lista, de modo que cuando la actualice, la actualización se reflejará en todas las referencias. Intente una comprensión del diccionario en su lugar. Ver Crear un diccionario con lista de comprensión en Python

 d = {k : v for k in blah blah blah} 

Podrías usar esto:

 data[:1] = ['hello']