2012-07-05 21 views
22

Estoy tratando de escribir un fragmento de código que pueda factorizar automáticamente una expresión. Por ejemplo, si tengo dos listas [1,2,3,4] y [2,3,5], el código debería ser capaz de encontrar los elementos comunes en las dos listas, [2,3], y combinar el resto de los elementos juntos en una nueva lista, siendo [1,4,5].Buscar elementos no comunes en las listas

De este post: How to find list intersection? veo que los elementos comunes se pueden encontrar por

set([1,2,3,4]&set([2,3,5]). 

¿Hay una manera fácil de recuperar los elementos no comunes de cada lista, en mi ejemplo es [1,4 ] y [5]?

puedo seguir adelante y hacer un bucle for:

lists = [[1,2,3,4],[2,3,5]] 
conCommon = [] 
common = [2,3] 
for elem in lists: 
    for elem in eachList: 
    if elem not in common: 
     nonCommon += elem 

Pero esto parece redundante e ineficiente. ¿Python proporciona alguna función útil que pueda hacer eso? ¡¡Gracias por adelantado!!

+0

desea obtener listas separadas como [1,4] y [5], o uno solo [1,4,5]? – nye17

Respuesta

40

usar el operador de diferencia simétrica para set s (aka el operador XOR):

>>> set([1,2,3])^set([3,4,5]) 
set([1, 2, 4, 5]) 
+0

oh wow gracias !! Bue hace que el código anterior tome la misma cantidad de tiempo de cálculo y espacio de memoria que el establecido ([1,2,3]) & set ([3,4,5])? ¿O no tiene una influencia significativa en el rendimiento del código? – turtlesoup

+0

Es la manera más eficiente de lograr su objetivo. Su complejidad está en el mismo orden que '&' (es decir, lineal en la cantidad de elementos en los conjuntos). – Amber

12

Puede utilizar el concepto de empalme para hacer frente a este tipo de problemas.

b1 = [1,2,3,4,5,9,11,15] 
b2 = [4,5,6,7,8] 
set(b1).intersection(b2) 
Out[22]: {4, 5} 

Lo mejor de usar este código es que funciona bastante rápido para datos grandes también. Tengo b1 con 607139 y b2 con 296029 elementos cuando uso esta lógica obtengo mis resultados en 2.9 segundos.

0

Puede usar el método de atributo .__xor__.

set([1,2,3,4]).__xor__(set([2,3,5])) 

o

a = set([1,2,3,4]) 
b = set([2,3,5]) 
a.__xor__(b) 
Cuestiones relacionadas