¿Cómo convertir la lista de tuplas clave-valor en el diccionario?


125

Tengo una lista que se parece a:

[('A', 1), ('B', 2), ('C', 3)]

Quiero convertirlo en un diccionario que se vea así:

{'A': 1, 'B': 2, 'C': 3}

¿Cuál es la mejor manera de hacer esto?

EDITAR: Mi lista de tuplas es en realidad más como:

[(A, 12937012397), (BERA, 2034927830), (CE, 2349057340)]

1
¿Qué tipo de entidades aquellos A, B(o BERA) y C(o CE) son en realidad? Gracias
comer

Estoy dispuesto a apostar que los errores producidos con los ejemplos de trabajo a continuación están relacionados con que no tiene una lista de tuplas, sino una lista extremadamente larga que quiere separar en 2 tuplas.
gddc

Respuestas:


90

Esto me da el mismo error que intentar dividir la lista y comprimirla. ValueError: el elemento de secuencia de actualización del diccionario # 0 tiene una longitud 1916; Se requiere 2

Esa es tu pregunta real .

La respuesta es que los elementos de su lista no son lo que usted piensa que son. Si escribe myList[0], encontrará que el primer elemento de su lista no es una tupla de dos, por ejemplo ('A', 1), sino un iterable de 1916 de longitud.

Una vez que en realidad tiene una lista en la forma que se indique en su pregunta original ( myList = [('A',1),('B',2),...]), todo lo que tiene que hacer es dict(myList).


Gracias, no sé cómo fue la lista de esa manera, pero después de volver a trabajar desde cero, pude solucionarlo.
Fred Wilson

1
@DJ_Stuffy_K: (suponiendo que el contexto no esté relacionado con esta pregunta) En general, a menos que sea superfluo o ralentice su programa, está perfectamente bien crear dictos como índices útiles en cualquier estructura de datos abstracta que esté construyendo implícitamente. La noción de "buena práctica" depende completamente del contexto; ¿necesita O (1) tiempo de búsqueda de claves? Tampoco puede "convertir listas a diccionarios" arbitrariamente; depende completamente de la semántica. por ejemplo [(1,2), (1,3)], ¡ {1:3}golpearía tus llaves y perdería información! Un dict es una relación de uno a * con el tiempo de inserción / eliminación de O (1). La lista es una lista.
ninjagecko

162
>>> dict([('A', 1), ('B', 2), ('C', 3)])
{'A': 1, 'C': 3, 'B': 2}

55
También comentó sobre otra respuesta que sugiere lo mismo: Esto no cubre tener 'claves' de tuplas duplicadas, por ejemplo: l=[('A',1), ('B',2), ('C',3), ('A', 2)]dará como resultado 'A': 1que no sea el resultado deseado.
Guival

32

¿Has probado esto?

>>> l=[('A',1), ('B',2), ('C',3)]
>>> d=dict(l)
>>> d
{'A': 1, 'C': 3, 'B': 2}

ValueError: el elemento de secuencia de actualización del diccionario # 0 tiene una longitud 1916; Se requiere 2
Fred Wilson

Eso fue un corte directo de mi terminal, por lo que debería funcionar. ¿Puedes mostrar exactamente lo que hiciste para obtener ese error?
Inútil

@ Fred, debes haber escrito mal algo, esta respuesta está bien.
Martineau

@FredWilson, ese es el error que generalmente obtienes cuando intentas algo comodict([string1, string2, string3, string4])
chacham15

2
Esto no cubre tener "claves" de tuplas duplicadas, por ejemplo: l=[('A',1), ('B',2), ('C',3), ('A', 2)]resultará en tener el 'A': 1que puede no ser el resultado deseado.
Guival

10

Aquí hay una manera de manejar duplicados "claves" de tupla:

# An example
l = [('A', 1), ('B', 2), ('C', 3), ('A', 5), ('D', 0), ('D', 9)]

# A solution
d = dict()
[d [t [0]].append(t [1]) if t [0] in list(d.keys()) 
 else d.update({t [0]: [t [1]]}) for t in l]
d

OUTPUT: {'A': [1, 5], 'B': [2], 'C': [3], 'D': [0, 9]}

¡Increíble! Me ayudó a salir.
unpairestgood

genial !, ayudó mucho
Athar

2

Otra forma de usar las comprensiones del diccionario,

>>> t = [('A', 1), ('B', 2), ('C', 3)]
>>> d = { i:j for i,j in t }
>>> d
{'A': 1, 'B': 2, 'C': 3}

2

Si Tuple no tiene repeticiones de teclas, es simple.

tup = [("A",0),("B",3),("C",5)]
dic = dict(tup)
print(dic)

Si la tupla tiene repeticiones clave.

tup = [("A",0),("B",3),("C",5),("A",9),("B",4)]
dic = {}
for i, j in tup:
    dic.setdefault(i,[]).append(j)
print(dic)

1
l=[['A', 1], ['B', 2], ['C', 3]]
d={}
for i,j in l:
d.setdefault(i,j)
print(d)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.