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.