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 a un diccionario b
, donde
b['hello'] = 'world'
b['1'] = '2'
¿Cuál es la forma sintácticamente más limpia de lograr esto?
python
list
dictionary
Miguel
fuente
fuente
Respuestas:
Si
a
es grande, probablemente querrá hacer algo como lo siguiente, que no hace ninguna lista temporal como la anterior.En Python 3 también podría usar una comprensión de dict, pero irónicamente creo que la forma más sencilla de hacerlo será con
range()
ylen()
, que normalmente sería un olor a código.Entonces, el
iter()/izip()
método sigue siendo probablemente el más Pythonic en Python 3, aunque como EOL señala en un comentario,zip()
ya es flojo en Python 3, por lo que no es necesarioizip()
.Si lo quieres en una línea, tendrás que hacer trampa y usar un punto y coma. ;-)
fuente
zip(i, i)
, en Python 3, ya quezip()
ahora devuelve un iterador.Respuesta simple
Otra opción (cortesía de Alex Martelli - fuente ):
Nota relacionada
Si tienes esto:
y quieres esto (cada elemento de la lista teclea un valor dado (2 en este caso)):
puedes usar:
fuente
fromkeys
.>>> dict.fromkeys(a, 2) {'bi': 2, 'double': 2, 'duo': 2, 'two': 2}
Puede usar una comprensión dict para esto con bastante facilidad:
Esto es equivalente al ciclo for a continuación:
fuente
Algo que encuentro bastante bueno, que es que si tu lista tiene solo 2 elementos:
Recuerde, dict acepta cualquier iterable que contenga un iterable donde cada elemento en el iterable debe ser un iterable con exactamente dos objetos.
fuente
Puede que no sea el más pitónico, pero
fuente
enumerate
for i, key in enumerate(a[::2]):
. Todavía no es pitónico ya que el constructor dict puede hacer la mayor parte del trabajo aquí por ustedfor i, key in enumerate(a[::2]):
podría funcionar el enfoque? Los valores de pares resultantes serían0 hello
y1 1
, y no está claro para mí cómo usarlos para producir{'hello':'world', '1':'2'}
.enumerate(a)[::2]
Puede hacerlo bastante rápido sin crear matrices adicionales, por lo que esto funcionará incluso para matrices muy grandes:
Si tienes un generador
a
, aún mejor:Aquí está el resumen:
fuente
{'hello':'hello','world':'world','1':'1','2':'2'}
)También puede hacerlo así (cadena para listar conversión aquí, luego conversión a un diccionario)
fuente
También estoy muy interesado en tener una línea para esta conversión, ya que esa lista es el inicializador predeterminado para el hash en Perl.
Respuesta excepcionalmente completa se da en este hilo -
El mío, soy un novato en Python), usando las expresiones del generador Python 2.7 , sería:
dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))
fuente
No estoy seguro de si esto es pitónico, pero parece funcionar
fuente
intente debajo del código:
fuente
También puede probar este enfoque, guardar las claves y los valores en una lista diferente y luego usar el método dict
salida:
fuente
fuente