2013-07-05 12 views
8

Chcę, aby Python uzyskał przecięcie listy zestawów.Pobierz przecięcie listy zestawów

Na przykład, mam funkcję zwracającą s listę zestawów następujący:

[set(0,1,3), set(1,3)] 

Jak widać przecięcie tego jest zbiór {1,3}. Jak mogę uzyskać pytona, aby uzyskać skrzyżowanie? To, co robiłem do tej pory, polega na iteracji na liście. Ale nie widzę, żeby dostać skrzyżowanie.

Rozwiązanie powinno być w stanie poradzić sobie z n-elementową listą zestawów, a nie tylko z parą.

Wszelkie pomysły?

listowe są mile widziane

Tak na marginesie, dlaczego jest zbiorem renderowane jako set([]) innymi słowy, dlaczego nie tylko z klamrami?

+7

To nie jest * union *, czyli * skrzyżowanie * zestawów. Związkiem będzie "{0, 1, 3}". –

+1

Składnia nawiasów klamrowych została później dodana do języka. –

+2

@MartijnPieters co żenujący mózg pierdnięcie. dzięki – franklin

Odpowiedz

21

Zastosowanie set.intersection:

>>> lis = [set((0,1,3)), set((1,3))] 
>>> set.intersection(*lis) 
set([1, 3]) 

Do stosowania związków set.union:

>>> set.union(*lis) 
set([0, 1, 3]) 

If performance sprawy następnie wykorzystać to:

>>> from itertools import islice 
>>> set.intersection(set(lis[0]), *islice(lis, 1, None)) 
set([1, 3]) 
+0

Usunięto moją odpowiedź, ponieważ dodano "set.union" do swojego. Niezłe. :) –

+0

Wszelka dokumentacja na temat tego, co robi wieloznacznik? – franklin

+0

@franklin http://docs.python.org/2/tutorial/controlflow.html#tut-unpacking-arguments –

2

Spróbuj tego:

reduce(set.intersection, L) 

In [83]: L = [set([0,1,3]), set([1,3])] 

In [84]: reduce(set.intersection, L) 
Out[84]: set([1, 3]) 
+0

To również nie działa, gdy 'L' ma zero elementów – EoghanM