2012-07-05 5 views
22

표현식을 자동으로 분석 할 수있는 코드를 작성하려고합니다. 예를 들어, 두 개의 목록 [1,2,3,4] 및 [2,3,5]가있는 경우 코드는 두 목록 [2,3]의 공통 요소를 찾아서 결합 할 수 있어야합니다 나머지 요소들은 [1,4,5]가되는 새로운 목록에 함께 포함됩니다. 이 게시물에서 목록에서 비 공통 요소 찾기

: 나는 공통 요소가

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

찾을 수 있습니다 것을 볼 How to find list intersection? 각 목록에서 비 공통 요소를 검색 할 수있는 쉬운 방법이있는 내 예제에서, 거기에 [1,4 ] 및 [5]?

내가 가서 루프를 수행 할 수 있습니다

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 

을하지만이 중복되고 비효율적 인 것 같다. 파이썬은 그렇게 할 수있는 편리한 함수를 제공합니까? 미리 감사드립니다 !!

+0

당신과 같은 별도의 목록을 얻을 싶어요 [1,4]와 [5], 또는 하나 하나 [1,4,5]? – nye17

답변

40

합니다 (XOR 연산자 일명) set 초 동안 대칭 차이 연산자를 사용

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

오 와우 감사합니다! Bue는 위의 코드가 set ([1,2,3]) & set ([3,4,5])와 같은 양의 계산 시간과 메모리 공간을 차지합니까? 아니면 코드 성능에 큰 영향을 미치지 않습니까? – turtlesoup

+0

목표를 달성하는 가장 효율적인 방법입니다. 그것의 복잡성은'&'와 같은 순서 (즉, 집합의 원소의 수에있어서 선형)에있다. – Amber

12

당신은 문제가 이런 종류의 거래를 교차 개념을 사용할 수 있습니다.

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

이 코드를 사용하는 것이 가장 좋습니다. 큰 데이터의 경우에도 매우 빠르게 작동합니다. 나는이 논리를 사용할 때 b1에 607139와 b2에 296029 개의 요소를 넣었고 결과는 2.9 초 만에 얻을 수 있습니다.

0

.__xor__ 속성 방법을 사용할 수 있습니다.

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

또는

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