values sort repeated remove keep from duplicate array python list duplicate-removal

sort - set python



python elimina duplicados de 2 listas (7)

Estoy tratando de eliminar duplicados de 2 listas. entonces escribí esta función:

a = ["abc", "def", "ijk", "lmn", "opq", "rst", "xyz"] b = ["ijk", "lmn", "opq", "rst", "123", "456", ] for i in b: if i in a: print "found " + i b.remove(i) print b

Pero creo que los elementos coincidentes que siguen a un elemento coincidente no se eliminan.

Obtengo un resultado como este:

found ijk found opq [''lmn'', ''rst'', ''123'', ''456'']

pero espero un resultado como este:

[''123'', ''456'']

¿Cómo puedo arreglar mi función para hacer lo que quiero?

Gracias.


Qué pasa

b= set(b) - set(a)

Si necesita posibles repeticiones en b para que también aparezcan repetidas en el resultado y / o en el orden para preservarlas, entonces

b= [ x for x in b if not x in a ]

haría.


Tu problema parece ser que estás cambiando la lista sobre la que estás iterando. Itere en lugar de una copia de la lista.

for i in b[:]: if i in a: b.remove(i) >>> b [''123'', ''456'']

Pero, ¿qué hay de usar una lista de comprensión en su lugar?

>>> a = ["abc", "def", "ijk", "lmn", "opq", "rst", "xyz"] >>> b = ["ijk", "lmn", "opq", "rst", "123", "456", ] >>> [elem for elem in b if elem not in a ] [''123'', ''456'']


Una forma de evitar el problema de editar una lista mientras la repites es usar comprensiones:

a = ["abc", "def", "ijk", "lmn", "opq", "rst", "xyz"] b = ["ijk", "lmn", "opq", "rst", "123", "456", ] b = [x for x in b if not x in a]


Usted pidió eliminar ambas listas duplicadas , esta es mi solución:

from collections import OrderedDict a = ["abc", "def", "ijk", "lmn", "opq", "rst", "xyz"] b = ["ijk", "lmn", "opq", "rst", "123", "456", ] x = OrderedDict.fromkeys(a) y = OrderedDict.fromkeys(b) for k in x: if k in y: x.pop(k) y.pop(k) print x.keys() print y.keys()

Resultado:

[''abc'', ''def'', ''xyz''] [''123'', ''456'']

Lo bueno aquí es que mantienes el orden de ambas listas


Ya hay muchas respuestas sobre "¿cómo se puede arreglar?", Así que este es un "¿cómo se puede mejorar y ser más pitónico?": Ya que lo que se quiere lograr es obtener la diferencia entre la lista b y la lista a , debe usar la operación de diferencia en conjuntos ( operaciones en conjuntos ):

>>> a = ["abc", "def", "ijk", "lmn", "opq", "rst", "xyz"] >>> b = ["ijk", "lmn", "opq", "rst", "123", "456", ] >>> s1 = set(a) >>> s2 = set(b) >>> s2 - s1 set([''123'', ''456''])


o un conjunto

set(b).difference(a)

estar advertido de que los conjuntos no conservarán el orden si eso es importante


Esto es lo que está pasando. Supongamos que tiene esta lista:

[''a'', ''b'', ''c'', ''d'']

y estás recorriendo cada elemento de la lista. Supongamos que se encuentra actualmente en la posición índice 1:

[''a'', ''b'', ''c'', ''d''] ^ | index = 1

... y quita el elemento en la posición de índice 1, dándole esto:

[''a'', ''c'', ''d''] ^ | index 1

Después de quitar el artículo, los otros elementos se deslizan hacia la izquierda, dándole esto:

[''a'', ''c'', ''d''] ^ | index 1

Luego, cuando el ciclo se ejecuta nuevamente, el ciclo incrementa el índice a 2, dándole esto:

[''a'', ''c'', ''d''] ^ | index = 2

¿Ves cómo te saltaste la ''c''? La lección es: nunca elimine un elemento de una lista por la que esté pasando el cursor.