valor resueltos recorrer lista elementos ejercicios ejemplo diccionarios diccionario dentro convertir buscar agregar python list dictionary

resueltos - Convierte una lista a un diccionario en Python



lista dentro de un diccionario python (12)

Algo que me parece genial, 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.

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?


No estoy seguro si esto es pitónico, 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))


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

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

También si tienes esto:

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

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


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 , incluso 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


Puede que no sea el más pitónico, pero

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


Puedes usar una comprensión dict para esto bastante fácilmente:

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 ciclo for a continuación:

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


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

La respuesta excepcionalmente completa se da en este hilo:

El mío, soy 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))


También puede hacerlo así (cadena para mostrar la conversión aquí, luego 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 puede intentar este enfoque guardar las claves y valores en diferentes listas 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''}


prueba el siguiente código:

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


#work~ ` a = [''Openstack'',''Puppet'',''Python''] b = {} c = 0 for v in a: b[v] = c c+=1 print b

`


b = dict(zip(a[::2], a[1::2]))

Si a es grande, probablemente desee 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 dict, pero irónicamente creo que la forma más simple 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 método iter()/izip() sigue siendo probablemente el más Pythonic en Python 3, aunque como EOL anota en un comentario, zip() ya es flojo en Python 3 por lo que no necesita de izip() .

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

Si lo quiere en una línea, tendrá que hacer trampa y usar un punto y coma. ;-)