Lista de tuplas al diccionario

112

Así es como estoy convirtiendo actualmente una lista de tuplas en un diccionario en Python:

l = [('a',1),('b',2)]
h = {}
[h.update({k:v}) for k,v in l]
> [None, None]
h
> {'a': 1, 'b': 2}

¿Existe una forma mejor? Parece que debería haber una sola línea para hacer esto.

Sarah Vessels
fuente

Respuestas:

178

Simplemente llame dict()a la lista de tuplas directamente

>>> my_list = [('a', 1), ('b', 2)]
>>> dict(my_list)
{'a': 1, 'b': 2}
Sven Marnach
fuente
1
Derp, sabía que habría una forma sencilla de hacerlo ... Viniendo de Ruby aquí, tratando de aprender la forma Python de hacer las cosas. ¡Gracias!
Sarah Vessels
5
@chandresh Esto hace el trabajo en Python 3, por lo que no se requiere una actualización.
Sven Marnach
@SvenMarnach, aquí está mi salida del mismo comando que ha escrito anteriormente en la terminal py 3.5. Traceback (última llamada más reciente): Archivo "<ipython-input-313-7bb3559567ff>", línea 1, en <module> dict (my_list) TypeError: El objeto 'Dictionary' no se puede llamar
CKM
4
@chandresh Esto no tiene nada que ver con Python 3, es porque tiene una variable llamada dict, sombreando el Python incorporado del mismo nombre. Nunca deberías hacer eso.
Sven Marnach
@SvenMarnach Oh. Gracias. Funcionó. De hecho, obtuve un código de la web e intenté ejecutarlo. Parece que el autor lo había usado dictcomo nombre de variable de donde obtuve el error. Gracias de nuevo.
CKM
23

El dictconstructor acepta la entrada exactamente como la tiene (tuplas clave / valor).

>>> l = [('a',1),('b',2)]
>>> d = dict(l)
>>> d
{'a': 1, 'b': 2}

De la documentación :

Por ejemplo, todos devuelven un diccionario igual a {"uno": 1, "dos": 2}:

dict(one=1, two=2)
dict({'one': 1, 'two': 2})
dict(zip(('one', 'two'), (1, 2)))
dict([['two', 2], ['one', 1]])
FogleBird
fuente
15

Con dictcomprensión:

h = {k:v for k,v in l}
Kenly
fuente
4
agradable porque le permite formatear la clave / valor antes de agregarlo al dict
jfunk
7

Parece que todos aquí asumen que la lista de tuplas tiene un mapeo uno a uno entre clave y valores (por ejemplo, no tiene claves duplicadas para el diccionario). Como esta es la primera pregunta que surge al buscar sobre este tema, publico una respuesta para un caso más general en el que tenemos que lidiar con duplicados:

mylist = [(a,1),(a,2),(b,3)]    
result = {}
for i in mylist:  
   result.setdefault(i[0],[]).append(i[1])
print(result)
>>> result = {a:[1,2], b:[3]}
pegah
fuente