2013-01-11 3 views
4

내가 요소를 반복 한 수 양의 정수의 두 정렬 된 목록을 가지고 있고 각 목록에서 숫자의 쌍을 일치 제거해야합니다에서 공통 요소를 제거 :두 목록

a=[1,2,2,2,3] 
b=[2,3,4,5,5] 

이 될해야합니다

a=[1,2,2] 
b=[4,5,5] 

즉 2와 3이 두 목록에 모두 표시되어 삭제되었습니다.

반복되는 요소로 인해 교차로를 사용할 수 없습니다.

어떻게해야합니까? 두 목록에 나타나는 요소를 제거하려면

+1

입력을 시도했지만 출력을 볼 수 없습니다. 더 많은 예제/추가 설명이 도움이 될 가능성이 있습니다 ... –

+1

3이 2의리스트뿐만 아니라 2 개의리스트에서 모두 제거 되었기 때문입니다. – nrussell

+0

중복 된 패치는 두 시퀀스에서 모두 제거해야한다는 것을 이해합니다. 시퀀스 정렬. 옳은??? –

답변

3

, 다음 사용

for i in a[:]: 
    if i in b: 
     a.remove(i) 
     b.remove(i) 

당신을 위해 그것을 수행하는 함수를 만드는 방법을 간단히 수행

def removeCommonElements(a, b): 
    for e in a[:]: 
     if e in b: 
      a.remove(e) 
      b.remove(e) 

또는 새 목록을 반환하지 기존 항목을 수정하려면

def getWithoutCommonElements(a, b): # Name subject to change 
    a2 = a.copy() 
    b2 = b.copy() 
    for e in a: 
     if e not in b: 
      a2.remove(e) 
      b2.remove(e) 
    return a2, b2 

그러나 이전 항목은으로 바꿀 수 있습니다. (210)과 같이 :

a2, b2 = a.copy(), b.copy() 
removeCommonElements(a2, b2) 

a와 b를 유지하지만 공통 요소가없는 중복을 만들 것이다.

+0

이것은'a = [1,2,2,2,3]'과'b = [2,2,3,4,5]'리스트에서는 작동하지 않고,'a = [1,2 , 3]','b = [3,4,5]'. – nrussell

+1

목록에서 요소를 제거하는 동안 목록을 반복하지 마십시오. 'iter (a)'를'a [:]'로 바꾸면 작동 할 것입니다. – pemistahl

+0

정확하게 필요한 것은 아닙니다 : [1,1,3], [1,1,1]은 [1, 3], [1, 1]을 반환하고 [1], [2] –

2

컬렉션에서 카운터 개체가 상당히 간결하게이 작업을 수행 할 수 있습니다

from collections import Counter 
a=Counter([1,2,2,2,3]) 
b=Counter([2,3,4,5,5]) 
print list((a-b).elements()) 
print list((b-a).elements()) 

아이디어는 다음과 같습니다

  1. 각 요소가 표시되는 방법을 자주 카운트 (예를 들어 2는 3 번 나타날 1 b에서 시간)
  2. 요소가 몇 번 추가 될지 계산하려면 빼십시오 (예 : 2는 b보다 3-1 = 2 배 더 많이 나타남)
  3. 각 요소에 여분의 수를 출력하십시오 시간의이 나타납니다 (컬렉션 요소 방법은 자동으로 1 이상의 카운트있는 모든 요소 방울)

(경고 : 출력 목록은 반드시 정렬되지 않습니다)

+0

+1 멋지게 완료되었습니다. 이것은 깨끗하고 빠른 솔루션입니다. –

2

은 목록이 당신을 정렬됩니다 감안할 때 예를 들어 다음과 같이 요소별로 합병/배포 할 수 있습니다.

x, y = [], [] 

while a and b: 
    if a[0] < b[0]: 
     x.append(a.pop(0)) 
    elif a[0] > b[0]: 
     y.append(b.pop(0)) 
    else: # a[0]==b[0] 
     a.pop(0) 
     b.pop(0) 

x += a 
y += b 
1

@Mahi가 제공 한 솔루션은 거의 정확합니다. 당신이 원하는 것을 달성하는 가장 간단한 방법은 이것이다 :

def remove_common_elements(a, b): 
    for i in a[:]: 
     if i in b: 
      a.remove(i) 
      b.remove(i) 
    return a, b 

여기서 중요한 것은 a[:]를 작성하여 a의 복사본을 만드는 것입니다. 목록에서 요소를 제거하면서 목록을 반복하는 경우 올바른 결과를 얻을 수 없습니다.

목록을 제자리에서 수정하지 않으려면 두 목록을 모두 복사하고 복사 된 목록을 반환하십시오.

def remove_common_elements(a, b): 
    a_new = a[:] 
    b_new = b[:] 
    for i in a: 
     if i in b_new: 
      a_new.remove(i) 
      b_new.remove(i) 
    return a_new, b_new 
0

하나의 해결책은 a의 새 복사본을 만들고 b에서 공통 요소를 제거하는 것입니다.

a = [1,2,2,2,3] 
b = [2,2,3,4,5] 

a_new = [] 
for ai in a: 
    if ai in b: 
     b.remove(ai) 
    else: 
     a_new.append(ai) 

print a_new 
print b