2017-05-17 1 views
6

안녕하세요, 파이썬에서 두리스트가 있고 두리스트에서 공통 값을 제거하고 싶다고합시다. 해결책은 다음과 같습니다.파이썬에서 두리스트의 공통 값 제거하기

x = [1, 2, 3, 4, 5, 6, 7, 8] 
y = [43, 3123, 543, 76, 879, 32, 14241, 342, 2, 3, 4] 
for i in x: 
    if i in y: 
     x.remove(i) 
     y.remove(i) 

정확하지만 보이지 않습니다. 이유는 목록에서 항목을 제거하면 색인이 계속 반복되기 때문입니다. 따라서 값이 서로 가까이있는 두 개의 공통 값에 대해서는 나중에 값이 누락됩니다 (코드는 반복하지 않습니다). 결과는 다음과 같습니다

>>> x 
[1, 3, 5, 6, 8, 9, 10] 
>>> y 
[43, 3123, 543, 76, 879, 32, 14241, 342, 3] 

그래서 우리는 값 '3' 누락되었습니다.

내가 언급 한 행동의 이유는 무엇입니까? 아니면 나 다른 잘못하고있는거야?

+0

네, 개체를 반복하면서 개체를 수정하면이 문제가 발생할 수 있습니다. –

+0

이 질문을보십시오 : [반복하는 동안 목록에서 항목 제거] (https://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating) – direprobs

+0

강력하게 권장하지 않습니다. 반복하는 값을 수정하십시오. 이렇게하면 코드가하는 일을 이해하려는 사람이 루프의 흐름을 판단하기가 어려울 수 있습니다. 이런 경우 다음과 같이 목록이나 다른 반복 가능한 객체의 개별 사본을 수정하거나 색인을 반복하여 목록에 추가하는 것이 일반적입니다. 'for i in range (len (x)) : print (x [i])' – Aaron

답변

8

그냥 약간의 변화 코드 반복 :

x, y = np.setdiff1d(x, y), np.setdiff1d(y, x) 

당신은 NumPy와를 사용하지 않으려면 x이면 x[:]입니다. 목록을 반복하면서 수정하고 있습니다. 당신이 값 3

for i in x[:]: 
     if i in y: 
      x.remove(i) 
      y.remove(i) 

그리고 다른 방법

x,y = [i for i in x if i not in y],[j for j in y if j not in x] 
+0

리스트에 중복 된 값이 있으면 작동하지 않습니다.'x = [1, 2, 3, 4, 5, 6, 7, 8, 3]'y의 복사본을 만들어야합니다. – DSLima90

+0

@ DSLima90 나는 OP 요구 사항까지, 만약 그가 모든 복제본을 제거하고 싶다면 작동하지 않을 것이라고 생각한다. 그러나 두 목록에서 삭제 한 후에는 첫 번째 목록에서 고유하게 나타납니다. 그래서 그게 문제가 아니에요. –

+0

@ Rhaul 네, 맞습니다. 나는 OP가 제공된 코드에 대한 나의 해석으로 모든 사건을 지우고 싶어한다고 가정했다. 그것은 유효한 대답입니다. 그러나 지금까지 그면에서 다른 답변과 다른 점은 주목할만한 가치가 있습니다. – DSLima90

3
z=[i for i in x if i not in y] 
w=[i for i in y if i not in x] 
x=z 
y=w 

트릭을해야합니까? 그것은 약간의 메모리 효율적인. 당신이 numpy를 사용하는 경우

+0

예 이것이 결국 내가 한 일입니다. 감사합니다. – MaPy

+0

이것은'x, y = [i가 y라면 x는 i를 의미합니다.], [i는 y를 의미 할 수 없습니다]'로 압축 될 수 있습니다. –

2

, 당신이 필요로하는 모든입니다 : 복사를 통해,

x, y = list(set(x).difference(y)), list(set(y).difference(x)) 
6

또한 set 개체의 차이를 사용할 수없는 이유 그래서입니다.

a = list(set(y) - set(x)) 
b = list(set(x) - set(y)) 
+0

이 단점은 모든 중복 항목을 제거하고 주문을 잃게된다는 것입니다. 하지만 보통이 일을 원하는 사람들에게는 문제가되지 않습니다. – abccd

1

나는 개인적으로 파이썬의 set 데이터 유형이 갈 수있는 방법이라고 생각 :

이 같은 수행 할 수 있습니다

>>> x = [1, 2, 3, 4, 5, 6, 7, 8] 
>>> y = [43, 3123, 543, 76, 879, 32, 14241, 342, 2, 3, 4] 
>>> sx = set(x) 
>>> sy = set(y) 
>>> sx.union(sy) 
set([1, 2, 3, 4, 5, 6, 7, 8, 32, 43, 76, 342, 543, 879, 3123, 14241]) 

을 또는 당신은 하나의 라이너로 줄일 수

list(set(x).union(set(y))) 
관련 문제