원본 목록에서 중복을 제거하지 않고 두 목록을 결합하고 중복 제거


115

두 번째 목록에 첫 번째 목록의 중복이 무시 된 경우 결합해야하는 두 개의 목록이 있습니다. .. 설명하기가 조금 어렵습니다. 코드가 어떻게 생겼는지, 그 결과 제가 원하는 것을 보여 드리겠습니다.

first_list = [1, 2, 2, 5]

second_list = [2, 5, 7, 9]

# The result of combining the two lists should result in this list:
resulting_list = [1, 2, 2, 5, 7, 9]

결과에 두 개의 "2"값을 포함 하여 첫 번째 목록이 있지만 second_list에도 추가 2 및 5 값이 있다는 사실은 첫 번째 목록에 추가되지 않습니다.

일반적으로 이와 같은 경우 세트를 사용하지만 first_list의 세트는 이미 가지고있는 중복 값을 제거합니다. 그래서 저는이 원하는 조합을 달성하는 가장 좋은 / 가장 빠른 방법이 무엇인지 궁금합니다.

감사.


3
3 개의 2가 있으면 second_list어떨까요?
balpha 2009.08.23

@balpha : 네, 아직 어떻게 처리할지 완전히 결정하지 않았습니다. 그것은 내가 생각했던 것이지만 문제에 대한 나의 우유부단 함을 감안할 때
빠진 것입니다.

답변:


168

첫 번째 목록에없는 두 번째 목록의 요소를 첫 번째 목록에 추가해야합니다. 집합은 다음과 같이 요소를 결정하는 가장 쉬운 방법입니다.

first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

in_first = set(first_list)
in_second = set(second_list)

in_second_but_not_in_first = in_second - in_first

result = first_list + list(in_second_but_not_in_first)
print(result)  # Prints [1, 2, 2, 5, 9, 7]

또는 원 라이너를 선호하는 경우 8-)

print(first_list + list(set(second_list) - set(first_list)))

2
또는 정렬이 필요한 경우 : print first_list + sorted (set (second_list)-set (first_list))
hughdbrown

2
목록 (set (first_list) | set (second_list)) # | 교차로로 설정 됨 stackoverflow.com/questions/4674013/…
staticd

1
@staticd : 예,하지만 잘못된 대답입니다. 2결과에는 두 개가 있어야 할 때 하나만 있습니다.
RichieHindle 2013 년

죄송합니다. 네가 옳아. 첫 번째 목록 중복 허용 된다는 사실을 완전히 놓쳤습니다 . : P
staticd

66
resulting_list = list(first_list)
resulting_list.extend(x for x in second_list if x not in resulting_list)

7
마지막으로 세트로 캐스팅하지 않는 답변입니다! 명성.
SuperFamousGuy 2013 년

4
이것은 실제로 O (n * m)이지만 해시 할 수없는 항목의 목록이 있고 성능이 문제가되지 않을 때 유용 할 수 있습니다.
alcuadrado

1
첫 번째도 두 번째도 복제하지 않으려는 것은 무엇입니까?
Dejell 2013-12-05

이 기술은 목록의 속성 순서를 유지하지만 set. 👍
Subhash Bhushan

29

세트를 사용할 수 있습니다.

first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

resultList= list(set(first_list) | set(second_list))

print(resultList)
# Results in : resultList = [1,2,5,7,9]

네 감사합니다. 이것은 잘 작동합니다. resultList = first_list + list (set (second_list) -set (first_list))
Kathiravan Umaidurai

9

numpy를 사용하면 한 줄의 코드로 가져올 수 있습니다.

a = [1,2,3,4,5,6,7]
b = [2,4,7,8,9,10,11,12]

sorted(np.unique(a+b))

>>> [1,2,3,4,5,6,7,8,9,10,11,12]

7
first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

print( set( first_list + second_list ) )

5
resulting_list = first_list + [i for i in second_list if i not in first_list]

1
first_list를 설정하면 "설정"됩니다
u0b34a0f6ae 2009-08-23

결과 목록은 정렬되지 않습니다.
avakar

1
목록에 중복되는 항목이 전혀 없도록하려면 어떻게해야합니까? 이렇게하면 하나의 목록에 중복이있는 경우 반환됩니다.
Dejell 2013-12-05

5

나에게 가장 간단한 것은 :

first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

merged_list = list(set(first_list+second_list))
print(merged_list)

#prints [1, 2, 5, 7, 9]

1
즉 훌륭한 솔루션,하지만 우리가 사전의 배열 세트 예 (올릴 만들려고하지 작동하는지 것을 명심 TypeError: unhashable type: 'dict')
lakesare

2

순서를 유지 하는 평균 케이스 O (m + n) 알고리즘에 대해 RichieHindle과 Ned Batchelder의 응답을 결합 할 수도 있습니다 .

first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

fs = set(first_list)
resulting_list = first_list + [x for x in second_list if x not in fs]

assert(resulting_list == [1, 2, 2, 5, 7, 9])

x in s의 최악의 복잡성 갖는다 O (m)를 소위, 최악 이 코드의 복잡성은 여전히 O (N * m) .


0

이것은 도움이 될 수 있습니다

def union(a,b):
    for e in b:
        if e not in a:
            a.append(e)

합집합 함수는 두 번째 목록을 첫 번째 목록으로 병합하고 a의 요소가 이미 a에있는 경우 복제하지 않습니다. 집합 조합 연산자와 유사합니다. 이 기능은 변경되지 않습니다. b. a = [1,2,3] b = [2,3,4] 인 경우. union (a, b)가 a = [1,2,3,4] 및 b = [2,3,4]를 만든 후



-2
    first_list = [1, 2, 2, 5]
    second_list = [2, 5, 7, 9]

    newList=[]
    for i in first_list:
        newList.append(i)
    for z in second_list:
        if z not in newList:
            newList.append(z)
    newList.sort()
    print newList

[1, 2, 2, 5, 7, 9]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.