2016-10-21 2 views
-3

So wie ich weiß, die Kreuzung von zwei Listen zu finden, indem Sie:im Kreuzungselemente nicht finden, von zwei Listen

>>> a = [1,2,3,4,5] 
>>> b = [1,3,5,6] 
>>> list(set(a) & set(b)) 
[1, 3, 5] 

Aber was ist der beste Weg, um alle Elemente zu finden, die nicht in die enthalten sind Überschneidung. Meine Idee ist es, eine Vereinigung der beiden Listen zu erstellen und dann entfernen Sie alle Elemente aus der Kreuzung von der Vereinigung als solche:

>>> a = [1,2,3,4,5] 
>>> b = [1,3,5,6] 
>>> intersection = list(set(a) & set(b)) 
>>> union = list(set(a) | set(b)) 
>>> non_intersection = intersection - union 
[2, 4, 6] 

Ist dies der beste Weg, dies zu tun, oder gibt es einen anderen Weg?

+4

Was Sie suchen die symmetrische Differenz bezeichnet wird. Sets haben eine Methode dafür. Versuchen Sie zu googeln. – BrenBarn

+1

Um hinzuzufügen, was BrenBarn gesagt hat, verwenden Sie '^' anstelle von '&'. – MooingRawr

+0

Dies ist in der Dokumentation abgedeckt. Es ist der [erste Treffer] (https://docs.python.org/2/library/stdtypes.html#set) unter "python set methods". Wie hast du das bei deiner Suche nicht gefunden? – Prune

Antwort

3

Symmetrischer Unterschied?

>>> set(a).symmetric_difference(b) 
{2, 4, 6} 
+1

'symmetric_difference' nimmt jedes iterable, so dass der zweite Aufruf von' set' entfällt. –

+0

Cool, verpasst, danke – ubundows

1

Ich ziehe es in der Regel eine Abkürzung

set(a)^set(b) 
{2, 4, 6} 
+0

Gerade festgestellt, dass @MooingRawr sagte, dass im Kommentar unter der Frage ... –

Verwandte Themen