Autor Tema: Diccionario de una lista de tuplas

0 Usuarios y 1 Visitante están viendo este tema.

23 Noviembre, 2020, 12:58 am
Leído 1294 veces

Quema

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,765
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Si de la lista1 me piden que cree un diccionario

{'a':[1,2], 'b':[1,2]}

lista1=[('a',1),('a',2),('b',1),('b',2)]
dic={}
for tupla in lista1:
    dic[tupla[0]]=[tupla[1],tupla[1]]
print(dic)

pero no me aparece el 2.

Luego hice de esta forma, que llegué al resultado, pero ingresando a mano las 'a','b'. no se cómo hacerlo automático

l=[('a',1),('b',1),('a',2)]
l1=['a','b']
la=[]
lb=[]
for i in l:
    if i[0]=='a':
        la.append(i[1])
    elif i[0]=='b':
        lb.append(i[1])
l3=[la]+lb
d=zip(l1,l3)
f=dict(d)
print(f)

23 Noviembre, 2020, 02:05 am
Respuesta #1

manooooh

  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 3,348
  • País: ar
  • Karma: +1/-0
  • Sexo: Masculino
Hola

No programo en Python pero por lo que entiendo cuando escribes:

lista1=[('a',1),('a',2),('b',1),('b',2)]
dic={}
for tupla in lista1:
    dic[tupla[0]]=[tupla[1],tupla[1]]
print(dic)

La línea dic[tupla[0]]=[tupla[1],tupla[1]] lo que entiendo que hace es formar el diccionario de la siguiente manera:

Código: [Seleccionar]
{"recorro todas las 1ras componentes de las tuplas sin repetir":
     ["escribo la 2da componente de la [b]última tupla[/b] que aparece con la misma 1ra componente",
     "escribo la 2da componente de la [b]última tupla[/b] que aparece con la misma 1ra componente"]}

Esto se comprueba al intercambiar por ejemplo ('a',1) con ('a',2) de modo que lista1=[('a',2),('a',1),('b',1),('b',2)], y como la última tupla que comienza con 'a' lleva el 1, el diccionario quedará {'a': [2, 2], 'b': [1, 1]}.

Una solución que encontré fue basarme en este tutorial, por lo que el código queda:

Código: [Seleccionar]
lista1=[('a',1),('a',2),('b',1),('b',2)]
lista1.sort()
dic={}
for letra,nro in lista1:
    dic.setdefault(letra, []).append(nro)
print(dic)

Si necesitas que los elementos de la lista queden ordenados porque por ejemplo tu lista es lista1=[('a',2),('a',1),('b',1),('b',2)] simplemente agrega lista1.sort() antes del dic={}.

Dime si te ha servido. Si me preguntas por cómo es que funciona, deberás esperar a alguien especializado.

Saludos

23 Noviembre, 2020, 03:53 am
Respuesta #2

ingmarov

  • Moderador Global
  • Mensajes: 5,055
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Estás repitiendo preguntas, esto ya lo habías hecho.

...
Si de la lista1 me piden que cree un diccionario

lista1=[('a',1),('a',2),('b',1),('b',2)]
....

Se puede convertir una lista de tuplas si el primer elemento de cada tupla es único, no se repite.

Puedes convertir la lista lista1=[("a",1),("b",2),("c",3)],  con la linea

diccionario=dict(lista1)


Saludos
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

23 Noviembre, 2020, 08:22 am
Respuesta #3

feriva

  • $$\Large \color{#a53f54}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,643
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Hola, manoooh, buenos días.

Si necesitas que los elementos de la lista queden ordenados porque por ejemplo tu lista es lista1=[('a',2),('a',1),('b',1),('b',2)] simplemente agrega lista1.sort() antes del dic={}.

Sí, pero cuidado con eso, porque ordena tanto números como letras por orden alfabético; mezclando las cosas, o sea deshaciendo las parejas originales.

Saludos.

23 Noviembre, 2020, 08:30 am
Respuesta #4

manooooh

  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 3,348
  • País: ar
  • Karma: +1/-0
  • Sexo: Masculino
Hola feriva buen inicio de semana!!

Gracias por el aviso. Ya veía que algo iba a fallar.

Según busqué hay que agregar algo al parámetro de sort y es lo que indica aquí: https://www.kite.com/python/answers/how-to-sort-a-list-of-tuples-by-the-second-value-in-python

No puedo probarlo ahora. Si quieres expón tu propuesta o explica la mía :).

Un abrazo virtual

23 Noviembre, 2020, 09:22 am
Respuesta #5

feriva

  • $$\Large \color{#a53f54}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,643
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Hola feriva buen inicio de semana!!

Gracias por el aviso. Ya veía que algo iba a fallar.

Según busqué hay que agregar algo al parámetro de sort y es lo que indica aquí: https://www.kite.com/python/answers/how-to-sort-a-list-of-tuples-by-the-second-value-in-python

No puedo probarlo ahora. Si quieres expón tu propuesta o explica la mía :).

Un abrazo virtual

Hola otra vez, manooooh.

Pues lo recordaba mal, no mezcla, ordena por el primer elemento del par (a,b). La cuestión estaría más bien en si quisiéramos ordenar por el segundo valor.

Ya he visto el enlace (bueno, no exactamente eso, porque no me sale la página, pero he pegado en el buscador “jou tu sort a lis of secon valor...” y, después de llamarme paleto el Google, ya me ha llevado a una web adecuada).

Lo que usa (en la explicación que he visto) lo conocía pero lo he usado poco, es la función lambda.

Básicamente la función lambda es como definir una función con def pero siendo una función sencilla, de una sola instrucción, digamos.

Se escribiría así

Código: [Seleccionar]
lista =[("c",2),("b",3),("a",1)]
lista.sort(key =lambda x:x[1])
print (lista)

y devolvería [('a', 1), ('c', 2), ('b', 3)], ordenando por los números.

Un abrazo (aquí seguimos con Drácula :) )