Convertir una lista a un diccionario en Python

Digamos que tengo una lista 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á hacer algo como lo siguiente, que no hace ninguna lista temporal 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 es con range() y len() , que normalmente sería un olor de código.

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

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

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

Si lo quieres en una línea, tendrás que hacer trampa y usar un punto y coma. 😉

Respuesta simple

Otra opción (cortesía de Alex Martelli https://stackoverflow.com/a/2597178/104264 ):

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


Nota relacionada

Si tienes esto:

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

y desea esto (cada elemento de la lista que 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} 

Puedes usar una comprensión de dictado para esto con bastante facilidad:

 a = ['hello','world','1','2'] my_dict = {item : a[index+1] for index, item in enumerate(a) if index % 2 == 0} 

Esto es equivalente al siguiente bucle for:

 my_dict = {} for index, item in enumerate(a): if index % 2 == 0: my_dict[item] = a[index+1] 

Algo que encuentro muy bueno, que es que si tu lista solo tiene 2 elementos:

 ls = ['a', 'b'] dict([ls]) >>> {'a':'b'} 

Recuerde, dict acepta cualquier iterable que contenga un iterable donde cada elemento en el iterable debe ser un iterable con exactamente dos objetos.

Puede que no sea el más python, pero

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

Puede hacerlo bastante rápido sin crear matrices adicionales, por lo que esto funcionará incluso para matrices muy grandes:

 dict(izip(*([iter(a)]*2))) 

Si tienes un generador a , aún mejor:

 dict(izip(*([a]*2))) 

Aquí está el resumen:

 iter(h) #create an iterator from the array, no copies here []*2 #creates an array with two copies of the same iterator, the trick izip(*()) #consumes the two iterators creating a tuple dict() #puts the tuples into key,value of the dictionary 

También puede hacerlo así (cadena para enumerar la conversión aquí, luego la conversión a un diccionario)

  string_list = """ Hello World Goodbye Night Great Day Final Sunset """.split() string_list = dict(zip(string_list[::2],string_list[1::2])) print string_list 

También estoy muy interesado en tener una sola línea para esta conversión, ya que esta lista es el inicializador predeterminado para el hash en Perl.

La respuesta excepcionalmente completa se da en este hilo:

  • Python convierte la lista al diccionario

El mío uno, soy un novato en Python), usando Python 2.7 Generator Expressions , sería:

dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))

No estoy seguro de si esto es pythonic, pero parece funcionar

 def alternate_list(a): return a[::2], a[1::2] key_list,value_list = alternate_list(a) b = dict(zip(key_list,value_list)) 

intente a continuación el código:

  >>> d2 = dict([('one',1), ('two', 2), ('three', 3)]) >>> d2 {'three': 3, 'two': 2, 'one': 1} 

También puede probar este enfoque, guardar las claves y los valores en una lista diferente y luego usar el método dict

 data=['test1', '1', 'test2', '2', 'test3', '3', 'test4', '4'] keys=[] values=[] for i,j in enumerate(data): if i%2==0: keys.append(j) else: values.append(j) print(dict(zip(keys,values))) 

salida:

 {'test3': '3', 'test1': '1', 'test2': '2', 'test4': '4'} 
 {x: a[a.index(x)+1] for x in a if a.index(x) % 2 ==0} result : {'hello': 'world', '1': '2'} 
 #work~ ` a = ['Openstack','Puppet','Python'] b = {} c = 0 for v in a: b[v] = c c+=1 print b 

`