Eliminar elementos comunes de las listas

Con estas listas:

a=[2,6,79,10] b=[6,7,2,0,8,5] 

La salida deseada sería:

 a=[79,10] b=[7,0,8,5] 

¿Por qué este código no funciona?

 def cel(a,b): for x in a: if x in b: b.remove(x) a.remove(x) 

Puede utilizar operaciones de ajuste para este propósito:

 i = set(a).intersection(set(b)) a = list(set(a).difference(i)) b = list(set(b).difference(i)) 

EDITAR Intenté depurar su código original y me di cuenta de que omite un número cada vez que lo elimina. Después de buscar en Google, descubrí que modificar una lista al iterar no es un comportamiento definido debido a algunos problemas de indexación interna. La solución más sencilla sería utilizar una copia de la matriz original en su bucle for como:

 for x in a[:]: if x in b: b.remove(x) a.remove(x) 

El algoritmo en la respuesta de @gokcehan que conserva el orden es cúbico O(n**3) . Es muy ineficiente incluso para listas de tamaños moderados (el libro Programming Pearls tiene un ejemplo en el que un algoritmo lineal en Básico supera al algoritmo cúbico en C (minutos frente a días)).

Puedes conservar el orden y ejecutarlo en tiempo lineal:

 common = set(a).intersection(b) a = [x for x in a if x not in common] b = [x for x in b if x not in common] 

Puedes hacerlo en el lugar:

 def remove_items(lst, items): items = set(items) # unnecessary in your case pos = 0 for x in lst: if x not in items: lst[pos] = x # save pos += 1 del lst[pos:] common = set(a).intersection(b) remove_items(a, common) remove_items(b, common) 

manifestación