¿Convertir [key1,val1,key2,val2] en un dict?
Digamos que tengo una lista a
en 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?
b = dict(zip(a[::2], a[1::2]))
Si a
es 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.
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}