2011-06-21 10 views
5

Chcę znaleźć przecięcie dwóch list w python. Mam coś, co wygląda tak:przecinają dwie listy słów w pytonie

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

i chcę, aby znaleźć coś, co wygląda tak:

t = ['peach', 'watermelon'] 

wiem że to proste pytanie, ale jestem nowy w Pythonie - czy ktoś ma jakieś sugestie?

Odpowiedz

10

Metoda przecięcia() jest dostępna dla sets, którą można łatwo utworzyć z list.

ETA: jeśli chcesz listę z niego ...

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

Teraz t:

['watermelon', 'peach'] 
+2

beat mnie do niego. Zestawy działają również z operatorami binarnymi '|' (OR = union), '&' (AND = crosssection) i '^' (XOR = w jednym zbiorze, ale nie w obu), więc to też dałoby odpowiedź: 't = set (q) & set (w) ' –

+1

Hah, twój komentarz został opublikowany tak samo jak moja edycja. To zabawna próba wypisania przykładów, zanim ktoś inny je doda. – Turnsole

+0

idealne! i czy jest możliwe zapisanie listy przecięć (którą przypadkowo dokonuję w zbiorze) jako pliku csv? @lazyr @Hydrangea – user808545

4

preferowany sposób robi to poprzez set intersection:

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

Jeśli lista jest krótka, powinien zadziałać list comprehension.

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

Jednak uważaj, to jest O(n^2), więc nie jest bardzo wydajny z długich list.

+3

Rozwiązanie do zrozumienia listy ma kwadratową złożoność: 'lq * lw = O (n^2)' podczas gdy ustawiona operacja jest liniowa '2lq + lw = O (n)' z 'lq' i' lw' długość '' Listy q' i 'w' odpowiednio. – GaretJax

+0

Dlaczego upadek? – Kimvais

+0

Z powodu rozwiązania opartego na zrozumieniu listy. – GaretJax

1

To był omawiany tutaj na SO że intersection działa nieco szybciej, więc można użyć:

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