내가 요소를 반복 한 수 양의 정수의 두 정렬 된 목록을 가지고 있고 각 목록에서 숫자의 쌍을 일치 제거해야합니다에서 공통 요소를 제거 :두 목록
a=[1,2,2,2,3]
b=[2,3,4,5,5]
이 될해야합니다
a=[1,2,2]
b=[4,5,5]
즉 2와 3이 두 목록에 모두 표시되어 삭제되었습니다.
반복되는 요소로 인해 교차로를 사용할 수 없습니다.
어떻게해야합니까? 두 목록에 나타나는 요소를 제거하려면
내가 요소를 반복 한 수 양의 정수의 두 정렬 된 목록을 가지고 있고 각 목록에서 숫자의 쌍을 일치 제거해야합니다에서 공통 요소를 제거 :두 목록
a=[1,2,2,2,3]
b=[2,3,4,5,5]
이 될해야합니다
a=[1,2,2]
b=[4,5,5]
즉 2와 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를 유지하지만 공통 요소가없는 중복을 만들 것이다.
컬렉션에서 카운터 개체가 상당히 간결하게이 작업을 수행 할 수 있습니다
이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 멋지게 완료되었습니다. 이것은 깨끗하고 빠른 솔루션입니다. –
은 목록이 당신을 정렬됩니다 감안할 때 예를 들어 다음과 같이 요소별로 합병/배포 할 수 있습니다.
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
@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
하나의 해결책은 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
입력을 시도했지만 출력을 볼 수 없습니다. 더 많은 예제/추가 설명이 도움이 될 가능성이 있습니다 ... –
3이 2의리스트뿐만 아니라 2 개의리스트에서 모두 제거 되었기 때문입니다. – nrussell
중복 된 패치는 두 시퀀스에서 모두 제거해야한다는 것을 이해합니다. 시퀀스 정렬. 옳은??? –