2011-06-21 28 views
5

quiero encontrar la intersección de dos listas en python. tengo algo que se parece a esto:intersecar dos listas de palabras en python

>>> q = ['apple', 'peach', 'pear', 'watermelon', 'strawberry'] 
>>> w = ['pineapple', 'peach', 'watermelon', 'kiwi'] 

y quiero encontrar algo que se parece a esto:

t = ['peach', 'watermelon'] 

Sé que es un simple pregunta, pero soy nuevo pitón - ¿alguien tiene ¿alguna sugerencia?

Respuesta

10

El método de intersección() está disponible para sets, que se puede hacer fácilmente a partir de listas.

ETA: si desea una lista fuera de él ...

q = ['apple', 'peach', 'pear', 'watermelon', 'strawberry'] 
w = ['pineapple', 'peach', 'watermelon', 'kiwi'] 
t = list(set(q) & set(w)) 

Ahora t es:

['watermelon', 'peach'] 
+2

se me adelantó. Los conjuntos también funcionan con los operadores binarios '|' (OR = unión), '&' (AND = intersección) y '^' (XOR = en un conjunto pero no en ambos), por lo que también daría la respuesta: 't = set (q) & set (w) ' –

+1

Hah, su comentario publicado igual que mi edición. Es divertido intentar escribir ejemplos antes de que alguien más los agregue. – Turnsole

+0

¡perfecto! y ¿es posible guardar la lista de intersección (que accidentalmente hago en un conjunto) como un archivo csv? @lazyr @Hydrangea – user808545

4

La mejor forma de hacerlo es a través de set intersection:

list(set(q) & set(w)) 

Si las listas son cortas, un list comprehension debería funcionar.

t = [x for x in q if x in w] 

Sin embargo, tenga cuidado, esto es O(n^2), por lo que no es muy eficiente, con largas listas.

+3

La solución de comprensión de lista tiene complejidad cuadrática: 'lq * lw = O (n^2)' mientras que la operación establecida es lineal '2lq + lw = O (n)' con 'lq' y' lw' la longitud del ' q' y 'w' listas respectivamente. – GaretJax

+0

¿Por qué el voto a favor? – Kimvais

+0

Debido a la lista de soluciones basadas en la comprensión. – GaretJax

1

se discutió aquí en la SO que funciona intersection un poco más rápido, por lo que puede utilizar:

q = ['apple', 'peach', 'pear', 'watermelon', 'strawberry'] 
w = ['pineapple', 'peach', 'watermelon', 'kiwi'] 
set(q).intersection(w)