¿Cómo inicializar un dict con claves de una lista y un valor vacío en Python?

Resuelto Juanjo Conti asked hace 14 años • 7 respuestas

Me gustaría obtener de esto:

keys = [1,2,3]

a esto:

{1: None, 2: None, 3: None}

¿Existe una forma pitónica de hacerlo?

Esta es una manera fea de hacerlo:

>>> keys = [1,2,3]
>>> dict([(1,2)])
{1: 2}
>>> dict(zip(keys, [None]*len(keys)))
{1: None, 2: None, 3: None}
Juanjo Conti avatar Feb 11 '10 09:02 Juanjo Conti
Aceptado

dict.fromkeysresuelve directamente el problema:

>>> dict.fromkeys([1, 2, 3, 4])
{1: None, 2: None, 3: None, 4: None}

collections.defaultdictEn realidad, este es un método de clase, por lo que también funciona para subclases de dict (como ).

El segundo argumento opcional, que por defecto es None, especifica el valor que se utilizará para las claves. Tenga en cuenta que se utilizará el mismo objeto para cada clave, lo que puede causar problemas con valores mutables:

>>> x = dict.fromkeys([1, 2, 3, 4], [])
>>> x[1].append('test')
>>> x
{1: ['test'], 2: ['test'], 3: ['test'], 4: ['test']}

Si esto es inaceptable, consulte ¿Cómo puedo inicializar un diccionario cuyos valores son listas vacías distintas? para una solución alternativa.

Thomas Wouters avatar Feb 11 '2010 02:02 Thomas Wouters

Utilice una comprensión de dictado :

>>> keys = [1,2,3,5,6,7]
>>> {key: None for key in keys}
{1: None, 2: None, 3: None, 5: None, 6: None, 7: None}

La expresión de valor se evalúa cada vez, por lo que se puede usar para crear un dictado con listas separadas (digamos) como valores:

>>> x = {key: [] for key in [1, 2, 3, 4]}
>>> x[1] = 'test'
>>> x
{1: 'test', 2: [], 3: [], 4: []}
Adrien Plisson avatar Feb 11 '2010 11:02 Adrien Plisson
dict.fromkeys(keys, None)
Dominic Cooney avatar Feb 11 '2010 02:02 Dominic Cooney