Autor Tema: Lista de pares

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

22 Noviembre, 2020, 08:56 pm
Leído 158 veces

Quema

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,722
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Si tengo una lista de pares

x=[('a',2),('a',1),('b',1)]

quiero crear otra lista que me figuren pares con el primer elemento y la suma de los segundos elementos del par, es decir

out=[('a',3),('b',1)]

hice esto, pero no funciona

list=[]
lista1=[('a',1),('a',2),('b',1),('b',2)]
count=0
for i in lista1:
   count+=lista[1]
print(count)


22 Noviembre, 2020, 09:07 pm
Respuesta #1

mathtruco

  • Moderador Global
  • Mensajes: 4,995
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
Ni siquiera corre. ¿Puedes reescribirlo para que veamos qué estabas haciendo? Podrías encerrar los códigos entre [code] y [/code] para evitar problemas con la indentación.

22 Noviembre, 2020, 09:23 pm
Respuesta #2

feriva

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,172
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Si tengo una lista de pares

x=[('a',2),('a',1),('b',1)]

quiero crear otra lista que me figuren pares con el primer elemento y la suma de los segundos elementos del par, es decir

out=[('a',3),('b',1)]

hice esto, pero no funciona

list=[]
lista1=[('a',1),('a',2),('b',1),('b',2)]
count=0
for i in lista1:
   count+=lista[1]
print(count)

Puedes hacerla con unos contadores:

Código: [Seleccionar]
x=[('a',2),('a',1),('b',2)]
s1=0
s2=0
for i in (x):
if i[0]=='a':
s1=s1+i[1]
if i[0]=='b':
s2=s2+i[1]
print (s1, s2)


Saludos.

22 Noviembre, 2020, 09:44 pm
Respuesta #3

Quema

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,722
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Gracias, por qué pusiste:

for i in (x): el paréntesis.

Además, cómo se puede automatizar el
if i[0]=='a' y que no haya que ingresar el 'a' a mano.

Yo lo hice pasando las lista a dos columnas y luego operando en panda.

import pandas as pd
data = x=[('a',2),('a',1),('b',2)]

df = pd.DataFrame(data, columns =['Name', 'Age'])
df['Total']=df.groupby(['Name']).transform('sum')
 
print(df) 


suma bien, pero me quedan dos filas del 'a' y luego no se cómo pasar de columnas a una lista de pares.


22 Noviembre, 2020, 10:43 pm
Respuesta #4

feriva

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,172
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Gracias, por qué pusiste:

for i in (x): el paréntesis.

Además, cómo se puede automatizar el
if i[0]=='a' y que no haya que ingresar el 'a' a mano.

Yo lo hice pasando las lista a dos columnas y luego operando en panda.

import pandas as pd
data = x=[('a',2),('a',1),('b',2)]

df = pd.DataFrame(data, columns =['Name', 'Age'])
df['Total']=df.groupby(['Name']).transform('sum')
 
print(df) 


suma bien, pero me quedan dos filas del 'a' y luego no se cómo pasar de columnas a una lista de pares.

El paréntesis porque tengo costumbre de poner rangos así (5, 500) o con los números que sea, y entonces se me va la mano a ponerlo siempre; nada más que por eso.

El Pandas lo he mirado un poco ahora pero no lo he usado nunca, no sé cómo va. Lo que sí se puede hacer (que también se me ha ido la mano por costumbre) es poner un elif en vez del segundo if, que va más deprisa porque no lo lee si la condición anterior era cierta.

Se me ha ocurrido hacer otra cosa para automatizarlo, voy a mirar si funciona y si eso, lo pongo

Saludos.

22 Noviembre, 2020, 11:19 pm
Respuesta #5

feriva

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,172
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Mira a ver si así te puede valer

Código: [Seleccionar]

cont=0
x=[('a',2),('b',1),('a',2),('c',5),('d',6)]
y=['a','b','c','d']

for i in y:
for j in x:
if i==j[0]:
cont = cont + j[1]
print ("%s = %d" %(i,cont) )
cont = 0


O si quieres, sin escribir la lista "y", creándola en el programa

Código: [Seleccionar]
cont=0
x=[('a',2),('b',1),('a',2),('c',5),('d',6)]
L=[]
for y in x:
L.append(y[0])
for i in L:
for j in x:
if i==j[0]:
cont = cont + j[1]
print ("%s = %d" %(i,cont) )
cont = 0

Saludos.

22 Noviembre, 2020, 11:52 pm
Respuesta #6

feriva

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,172
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino

Éste se el definitivo; que al crear la lista de letras me repetía alguna; lo he solucionado usando "set" conjunto

Código: [Seleccionar]
cont=0
x=[('a',2),('b',1),('a',2),('c',5),('d',6)]
L=set()
for y in x:
L.add(y[0])
L=list(L)
L. sort()
for i in L:
for j in x:
if i==j[0]:
cont = cont + j[1]
print ("%s = %d" %(i,cont) )
cont = 0

23 Noviembre, 2020, 12:14 am
Respuesta #7

ingmarov

  • Moderador Global
  • Mensajes: 4,900
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Hola

Dejo otra forma de resolver. Lo hice mediante un diccionario.


Lo que entendí fue entre las tuplas se deben agrupar los que tienen igual el primer elemento sumando el segundo.

Código: [Seleccionar]
lista1=[('a',1),('a',2),('b',1),('b',2)]
diccionario={}
for i in lista1:
claves=diccionario.keys()
if i[0] in claves:
diccionario[i[0]]=diccionario[i[0]]+i[1]
else:
diccionario[i[0]]=i[1]

print(diccionario) #Lo único que obtengo un diccionario, en mi versión de python no parece fácil convertir este diccionario a una lista mediante diccionario.items()

Para convertir el diccionario en una lista como la original lista1 añadimos tres lineas,

lista2=[]
for i,j in diccionario.items():
    lista2.append((i,j))


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