[Python-es] obtener diferencias entre elementos de dos listas de listas.
Boris Perez Canedo
inf200523 en ucf.edu.cu
Vie Mar 5 16:28:58 CET 2010
> El 05/03/10 09:36, Boris Perez Canedo escribió:
>> Hola a todos.
>>
>> Viendo los comentarios relacionados con "Buscar
índices de un array (que
>> cumple condición) de forma
eficiente" y el analisis profundo que este
>> genero, me dio un poco de
verguenza respecto a un problema que se me
>> presento y del cual, incluso
antes de leer estos comentarios, sabia que
>> la solucion que habia
propuesto no era eficiente ni mucho menos
>> "elegante", pero
bueno lo de elegante se lo puedo achacar a mi falta de
>> experiencia con
Python o tambien puede ser que la falta de elegancia
>> genere la
ineficiencia.
>>
>> No pongo mi solucion porque me da tremenda
pena!
>>
>> Mi problema:
>> Encontrar las
diferencias entre los elementos de dos listas de listas
>> cuyos elementos
(listas) comparten entre si un elemento comun en una
>> posicion dada.
>> Disculpen el enredo espero entiendan mejor con lo siguiente:
>>
>> Entrada:
>> en ste caso el elemento considerado comun se
encuentra en la posicion 1
>>
>> L1 = [ [ 1, 1, 2] , [ 2, 3, 5 ]
, [ 3, 2, 8 ] ]
>>
>> L2 = [ [ 2, 1, 6 ], [ 3, 2, 8 ], [ 1, 3, 5
], [ 4, 4, 7] ]
>>
>> Salida:
>> [ (element1 ,
element2, diferencia),... ]
>>
>> la diferencia contiene los
indices donde ambos elementos difieren.
>>
>>
>> [ (
[ 1, 1, 2 ], [ 2, 1, 6 ], [ 0, 2 ] ), ([ 2, 3, 5 ], [ 1, 3, 5 ], [ 0
>> ] ),
( [ ], [ 4, 4, 7 ], [ 0, 1, 2 ] ) ]
>>
>> Aclarar que en ningun
caso, tanto las listas de entrada como la de
>> salida, tienen
obligatoriamente que estar ordenadas, pero si facilita la
>> solucion o
implica una mejora en la eficiencia pueden ser ordenadas.
>>
>>
>>
>> Gracias de antemano.
>>
>>
>> Saludos,
>> Boris.
>
Hola,
Ok, me convencieron, pero les advierto que esta de piedra, por asi
decirlo.
def compare(L1, L2):
if len(L1) <>
len(L2):
return None
else:
differ =
[]
for pos in range(len(L1)):
if L1[pos] <>
L2[pos]:
differ.append(pos)
return
differ
def FindDifferences(L1, L2, fixedPos):
not_in_L1 = []
not_in_L2 = []
for element2 in L2:
if element2 not in L1:
not_in_L1.append(element2)
for element1 in L1:
if element1 not in L2:
not_in_L2.append(element1)
differences = []
if len(not_in_L1) >= len(not_in_L2):
for pos in range(len(not_in_L1)):
found = False
for pos1 in
range(len(L1)):
if not_in_L1[pos][fixedPos] == L1[pos1][fixedPos]:
found = True
now = not_in_L1[pos]
before = L1[pos1]
diff = compare(now, before)
if diff <> []:
differences.append((now, before, diff))
break
if not
found:
differences.append((not_in_L1[pos], [], [-1]))
else:
for pos in range(len(not_in_L2)):
found = False
for pos2 in
range(len(L2)):
if not_in_L2[pos][fixedPos] == L2[pos2][fixedPos]:
found = True
before = not_in_L2[pos]
now = L2[pos2]
diff = compare(now, before)
if diff <> []:
differences.append((now, before, diff))
break
if not
found:
differences.append(([], not_in_L2[pos], [-1]))
return
differences
Lo que mas me molesta de esta solucion es que tengo que repetir
codigo (aparece en el if else)
Gracias y no me tiren piedras!
Ah,
otra cosa, interpretese L1 y L2 como: L1 obtenido de una base datos y L2 como:
informacion actual que se desea compara con L1.
Saludos,
Boris.
---
La mejor vacuna contra el virus A(H1N1) es la higiene personal
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20100305/74fbc07e/attachment.html>
Más información sobre la lista de distribución Python-es