¿Convertir [key1,val1,key2,val2] en un dict?

Resuelto Mike asked hace 13 años • 12 respuestas

Digamos que tengo una lista aen Python cuyas entradas se asignan convenientemente a un diccionario. Cada elemento par representa la clave del diccionario y el siguiente elemento impar es el valor

Por ejemplo,

a = ['hello','world','1','2']

y me gustaría convertirlo en un diccionario b, donde

b['hello'] = 'world'
b['1'] = '2'

¿Cuál es la forma sintácticamente más limpia de lograr esto?

Mike avatar Jan 02 '11 05:01 Mike
Aceptado
b = dict(zip(a[::2], a[1::2]))

Si aes grande, probablemente querrás hacer algo como lo siguiente, que no genera listas temporales como la anterior.

from itertools import izip
i = iter(a)
b = dict(izip(i, i))

En Python 3 también puedes usar una comprensión de dictado, pero, irónicamente, creo que la forma más sencilla de hacerlo será con range()y len(), que normalmente sería un olor a código.

b = {a[i]: a[i+1] for i in range(0, len(a), 2)}

Por lo tanto, el iter()/izip()método sigue siendo probablemente el más pitónico en Python 3, aunque, como señala EOL en un comentario, zip()ya es vago en Python 3, por lo que no es necesario izip().

i = iter(a)
b = dict(zip(i, i))

En Python 3.8 y posteriores puedes escribir esto en una línea usando el operador "morsa" ( :=):

b = dict(zip(i := iter(a), i))

De lo contrario, necesitarás usar un punto y coma para colocarlo en una línea.

kindall avatar Jan 01 '2011 22:01 kindall

respuesta sencilla

Otra opción (cortesía de Alex Martelli - fuente ):

dict(x[i:i+2] for i in range(0, len(x), 2))

Nota relacionada

Si tienes esto:

a = ['bi','double','duo','two']

y quieres esto (cada elemento de la lista ingresa un valor determinado (2 en este caso)):

{'bi':2,'double':2,'duo':2,'two':2}

puedes usar:

>>> dict((k,2) for k in a)
{'double': 2, 'bi': 2, 'two': 2, 'duo': 2}
JobJob avatar Oct 27 '2012 01:10 JobJob