2012-07-05 27 views
22

Próbuję napisać fragment kodu, który może automatycznie wpływać na wyrażenie. Na przykład: , jeśli mam dwie listy [1,2,3,4] i [2,3,5], kod powinien być w stanie znaleźć wspólne elementy na dwóch listach, [2,3] i połączyć pozostałe elementy razem na nowej liście, wynoszącej [1,4,5].Znajdowanie nietypowych elementów na listach

Od tego postu: How to find list intersection? widzę, że wspólne elementy można znaleźć

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

Czy istnieje prosty sposób pobrać zakaz wspólnych elementów z każdej listy, moim przykładem jest [1,4 ] i [5]?

mogę iść dalej i zrobić dla pętli:

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 

Ale to wydaje się zbędne i nieskuteczne. Czy Python zapewnia jakąś przydatną funkcję, która może to zrobić? Z góry dziękuję!!

+0

chcesz dostać oddzielne listy jak [1,4] i [5], lub jeden jeden [1,4,5]? – nye17

Odpowiedz

40

Użyj symetryczny operator różnicowy dla set s (aka operatora XOR):

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

oh wow thanks !! Czy powyższy kod Bue ma taką samą ilość czasu obliczeniowego i pamięci, jak ustawiono ([1,2,3]) i ustawiono ([3,4,5])? Lub nie ma to znaczącego wpływu na wydajność kodu? – turtlesoup

+0

Jest to najbardziej efektywny sposób na osiągnięcie celu. Jego złożoność jest w tej samej kolejności co '& '(mianowicie liniowa w liczbie elementów w zestawach). – Amber

12

Można użyć Przecięcie koncepcję radzenia sobie z tego rodzaju problemami.

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

Najlepszą rzeczą w używaniu tego kodu jest to, że działa bardzo szybko również w przypadku dużych danych. Mam b1 z 607139 i b2 z 296029 elementami, kiedy używam tej logiki, otrzymuję wyniki w 2,9 sekundy.

0

Można użyć metody atrybutu .__xor__.

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

lub

a = set([1,2,3,4]) 
b = set([2,3,5]) 
a.__xor__(b) 
Powiązane problemy