Gran problema de listas

Batista, Facundo FBatista en uniFON.com.ar
Mie Dic 22 14:59:34 CET 2004


[Carlos Eduardo Sotelo Pinto]

#- tengo las lista1= [codigo,cantidad, precio]
#- luego tengo la lista2=[codigo,cantidad, precio]
#- y una lista final
#- el problema es el diguiente
#- primero adiciono la lista 1 a la listafinal, y luego la lista 2 
#- comparando que los codigos sean diferente, si son iguales 
#- los sumo en la 
#- lista total
#- la idea es que estas listas son independientes, pero resulta un gran 

Sería bueno un ejemplo, pero partiendo de la base que lo que quieres es lo
siguiente...

 l1 = ['cod1', 5, 2]
 l2 = ['cod2', 2, 4]
 lf = [['cod1', 5, 2], ['cod2', 2, 4]]

o 

 l1 = ['cod1', 5, 2]
 l2 = ['cod1', 2, 4]
 lf = [['cod1', 7, 6]]

... sería trivial hacerlo con dos listas...:

>>> def junta(li1, li2):
	lif = []
	if li1[0] == li2[0]:
		lif.append([li1[0], li1[1]+li2[1], li1[2]+li2[2]])
	else:
		lif.append(li1)
		lif.append(li2)
	return lif

>>> li1 = ['cod1', 5, 2]
>>> li2 = ['cod2', 2, 4]
>>> junta(li1, li2)
[['cod1', 5, 2], ['cod2', 2, 4]]
>>> li1 = ['cod1', 5, 2]
>>> li2 = ['cod1', 2, 4]
>>> junta(li1, li2)
[['cod1', 7, 6]]

...pero más interesante extenderlo a cualquier cantidad de listas:

>>> def junta(listas):
	dic = {}
	for (cod, can, pre) in listas:
		(acan, apre) = dic.get(cod, (0, 0))
		acan += can
		apre += pre
		dic[cod] = (acan, apre)
	return [[cod, can, pre] for (cod, (can, pre)) in dic.items()]

>>> li1 = ['cod1', 5, 2]
>>> li2 = ['cod2', 2, 4]
>>> junta((li1, li2))
[['cod2', 2, 4], ['cod1', 5, 2]]
>>> li1 = ['cod1', 5, 2]
>>> li2 = ['cod1', 2, 4]
>>> junta((li1, li2))
[['cod1', 7, 6]]
>>> li1 = ['cod1', 5, 2]
>>> li2 = ['cod2', 2, 4]
>>> li3 = ['cod3', 8, 1]
>>> li4 = ['cod1', 1, 3]
>>> li5 = ['cod3', 3, 9]
>>> todas = (li1, li2, li3, li4, li5)
>>> junta(todas)
[['cod2', 2, 4], ['cod3', 11, 10], ['cod1', 6, 5]]
>>> 

Saludos.

.    Facundo

Bitácora De Vuelo: http://www.taniquetil.com.ar/plog
PyAr - Python Argentina: http://pyar.decode.com.ar/


  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
ADVERTENCIA.

La información contenida en este mensaje y cualquier archivo anexo al mismo,
son para uso exclusivo del destinatario y pueden contener información
confidencial o propietaria, cuya divulgación es sancionada por la ley.
Si Ud. No es uno de los destinatarios consignados o la persona responsable
de hacer llegar este mensaje a los destinatarios consignados, no está
autorizado a divulgar, copiar, distribuir o retener información (o parte de
ella) contenida en este mensaje. Por favor notifíquenos respondiendo al
remitente, borre el mensaje original y borre las copias (impresas o grabadas
en cualquier medio magnético) que pueda haber realizado del mismo.
Todas las opiniones contenidas en este mail son propias del autor del
mensaje y no necesariamente coinciden con las de Telefónica Comunicaciones
Personales S.A. o alguna empresa asociada.
Los mensajes electrónicos pueden ser alterados, motivo por el cual
Telefónica Comunicaciones Personales S.A. no aceptará ninguna obligación
cualquiera sea el resultante de este mensaje.
Muchas Gracias.




Más información sobre la lista de distribución Python-es