파이썬 목록에서 중복 항목을 제거하는 5가지 방법

파이썬 리스트에서 중복 항목 제거하기

본 튜토리얼에서는 파이썬 리스트에서 중복된 값을 삭제하는 다양한 방법에 대해 알아보겠습니다.

파이썬에서 리스트를 다루다 보면 중복된 항목을 제거하고 고유한 값만 유지해야 할 때가 있습니다.

이를 위한 몇 가지 방법이 존재하며, 본 튜토리얼에서는 다섯 가지 기법을 자세히 살펴보겠습니다.

파이썬 리스트의 기본 이해

논의를 시작하기 전에 파이썬 리스트의 기본 사항을 먼저 복습해 보겠습니다.

파이썬 리스트는 변경 가능한 자료형입니다. 즉, 요소를 추가하거나 제거하여 리스트 자체를 수정할 수 있습니다. 파이썬 리스트는 요소의 중복을 허용합니다.

그렇다면 어떻게 중복된 요소를 제거하고 고유한 값만 유지할 수 있을까요?

이러한 목표를 달성하는 데는 여러 방법이 있습니다. 고유한 값만 포함하는 새로운 리스트를 생성할 수도 있고, 원본 리스트를 직접 수정하여 중복된 항목을 삭제할 수도 있습니다.

이 튜토리얼에서는 이러한 방법들을 상세히 다룰 것입니다.

파이썬 리스트에서 중복 제거 방법

실제 예시를 통해 살펴보겠습니다. 친구의 생일 파티에 참석했다고 가정해 봅시다. 🎊🎉

파티 테이블 위에 놓인 다양한 간식들 중 몇 가지가 중복되어 있는 것을 발견했습니다. 이제 이 간식 리스트에서 중복된 항목들을 제거해 보도록 하겠습니다.

아래 이미지에 있는 모든 간식을 포함하는 리스트를 만들어 보겠습니다.

sweets = ["cupcake","candy","lollipop","cake","lollipop","cheesecake","candy","cupcake"]

위의 간식 리스트에서 ‘캔디’와 ‘컵케이크’가 두 번 반복되는 것을 확인할 수 있습니다. 이 예시 리스트를 사용하여 중복 항목을 제거해 보겠습니다.

반복문을 사용하여 중복 제거

가장 간단한 방법 중 하나는 각 항목이 한 번씩만 포함된 새로운 리스트를 생성하는 것입니다.

다음 코드를 살펴보세요:

unique_sweets = []
for sweet in sweets:
  if sweet not in unique_sweets:
    unique_sweets.append(sweet)

print(unique_sweets)

# 출력 결과
['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']
  • 빈 리스트 unique_sweets를 초기화합니다.
  • sweets 리스트를 반복하면서 각 간식에 접근합니다.
  • 만약 현재 간식(sweet)이 unique_sweets 리스트에 없다면, .append() 메서드를 사용하여 리스트의 끝에 추가합니다.

예를 들어, sweets 리스트에서 ‘캔디’가 두 번째로 나타났다고 가정해 보겠습니다. ‘캔디’는 이미 unique_sweets에 존재하므로 추가되지 않습니다. sweet not in unique_sweets 조건은 ‘컵케이크’와 ‘캔디’의 두 번째 등장 시점에서 False로 평가됩니다.

따라서 이 방법은 모든 항목이 중복 없이 정확히 한 번만 나타나는 unique_sweets 리스트를 생성합니다.

리스트 컴프리헨션을 이용한 중복 제거

리스트 컴프리헨션을 사용하여 unique_sweets 리스트를 채울 수도 있습니다.

리스트 컴프리헨션에 대한 복습이 필요하신가요?

▶️ 파이썬 리스트 컴프리헨션 튜토리얼을 참고하세요.

리스트 컴프리헨션 표현식 [output for item in iterable if condition is True]을 사용하여 위의 반복문을 간결하게 다시 작성해 보겠습니다.

unique_sweets = []
[unique_sweets.append(sweet) for sweet in sweets if sweet not in unique_sweets]
print(unique_sweets)

# 출력 결과
['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']

새로운 리스트를 만들기는 하지만, 출력 값이 unique_sweets 리스트에 대한 .append() 작업이므로 리스트를 값으로 채우지는 않습니다.

파이썬 리스트에서 중복 항목을 제거하기 위해 내장 리스트 메서드를 사용할 수도 있으며, 다음 섹션에서 이에 대해 설명합니다.

내장 리스트 메서드를 이용한 중복 제거

파이썬 리스트 메서드인 .count().remove()를 사용하여 중복된 항목을 삭제할 수 있습니다.

list.count(value) 구문을 사용하면 .count() 메서드는 리스트에서 value가 나타나는 횟수를 반환합니다. 따라서, 중복된 항목의 횟수는 1보다 크게 됩니다.

list.remove(value)는 리스트에서 첫 번째 value를 제거합니다.

위의 내용을 바탕으로 다음 코드를 작성할 수 있습니다:

for sweet in sweets:
  # 해당 간식의 개수가 1보다 큰지(중복된 항목인지) 확인
  if sweets.count(sweet) > 1:
  # 참일 경우, 첫 번째 해당 간식을 제거
    sweets.remove(sweet)

print(sweets)

# 출력 결과
['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']

.remove() 메서드는 첫 번째 값만 제거하므로, 두 번 이상 나타나는 항목을 제거하는 데에는 적합하지 않습니다.

  • 만약 특정 항목이 중복되어 있다면(정확히 두 번 나타난다면), 이 메서드는 첫 번째 항목을 제거합니다.
  • 만약 특정 항목이 K번 반복된다면, 위 코드를 실행한 후에도 K-1개의 반복은 여전히 남아있습니다.

일반적으로 중복이라고 하면 모든 반복을 가리킵니다.

이러한 경우를 처리하기 위해 위 루프를 수정하여 하나를 제외한 모든 반복을 제거할 수 있습니다. 특정 항목의 수를 확인하는 조건문을 사용하는 대신, while 루프를 실행하여 리스트의 모든 항목 개수가 1이 될 때까지 반복적으로 중복을 제거할 수 있습니다.

이제 sweets 리스트에 ‘컵케이크’가 2번, ‘캔디’가 3번 반복된다고 가정해 보겠습니다.

sweets = ["cupcake","candy","lollipop","cake","lollipop","candy","cheesecake","candy","cupcake"]

다음과 같이 while 루프를 사용하여 반복을 제거할 수 있습니다. while 루프는 sweet의 개수가 1보다 큰 동안 계속 실행됩니다. 개수가 1개만 남게 되면 sweet.count(sweet) > 1 조건은 False가 되고 루프는 다음 항목으로 건너뜁니다.

for sweet in sweets:
  # 해당 간식의 개수가 1보다 큰지(중복된 항목인지) 확인
  while(sweets.count(sweet) > 1):
  # 반복적으로 해당 간식을 첫 번째로 발견된 것부터 하나만 남을 때까지 제거합니다.
    sweets.remove(sweet)

print(sweets)
# 출력 결과
['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']

그러나 중첩된 루프를 사용하는 것은 효율적이지 않을 수 있으므로, 큰 리스트를 다루는 경우에는 앞서 설명한 다른 기법들을 사용하는 것이 좋습니다.

지금까지 다음 사항들을 배웠습니다:

  • 고유한 항목만 포함하는 새로운 리스트를 생성하여 파이썬 리스트에서 중복된 항목을 제거하는 방법
  • 리스트를 제자리에서 수정하기 위한 내장 리스트 메서드인 .count().remove()를 사용하는 방법

값이 반복 없이 모두 고유해야 하는 파이썬 내장 데이터 구조가 있습니다. 따라서 파이썬 리스트를 이러한 데이터 구조 중 하나로 캐스팅하여 중복을 제거할 수 있습니다. 그런 다음 다시 리스트로 변환합니다. 다음 섹션에서 이러한 작업을 수행하는 방법을 알아보겠습니다.

세트를 사용하여 중복 제거

파이썬 세트는 모두 고유한 요소들의 모음입니다. 따라서 세트의 항목 수(len(<set-obj>)으로 주어짐)는 존재하는 고유한 요소의 수와 같습니다.

set(iterable) 구문을 사용하여 모든 파이썬 이터러블을 세트로 변환할 수 있습니다.

이제 sweets 리스트를 세트로 변환하고 결과를 확인해 보겠습니다.

set(sweets)
# 출력 결과
{'cake', 'candy', 'cheesecake', 'cupcake', 'lollipop'}

위의 출력 결과에서 모든 항목이 정확히 한 번씩 나타나고 중복된 항목이 제거되었음을 알 수 있습니다.

또한 항목의 순서가 원래 리스트 sweets의 순서와 반드시 같을 필요는 없습니다. 파이썬 세트 객체는 순서가 없는 모음이기 때문입니다.

이제 리스트를 세트로 변환하여 중복을 제거했으므로, 다음과 같이 다시 리스트로 변환할 수 있습니다.

unique_sweets = list(set(sweets))
print(unique_sweets)

# 출력 결과
['cake', 'cheesecake', 'candy', 'cupcake', 'lollipop']

딕셔너리 키를 사용하여 중복 제거

파이썬 딕셔너리는 키가 값을 고유하게 식별하는 키-값 쌍의 모음입니다.

dict.fromkeys(keys, values) 구문과 함께 .fromkeys() 메서드를 사용하여 파이썬 딕셔너리를 만들 수 있습니다. 여기서 keysvalues는 각각 딕셔너리의 키와 값을 포함하는 이터러블입니다.

  • keys는 필수 매개변수이며, 딕셔너리의 키에 해당하는 모든 파이썬 이터러블이 될 수 있습니다.
  • values는 선택적 매개변수입니다. 만약 iterable 값을 지정하지 않으면 기본값인 None이 사용됩니다.

만약 값을 지정하지 않는다면, dict.fromkeys(sweets)는 값이 기본값인 None으로 설정된 파이썬 딕셔너리를 반환합니다. 다음 코드에서 이에 대해 살펴보겠습니다.

dict.fromkeys(sweets)

# 출력 결과
{'cake': None,
 'candy': None,
 'cheesecake': None,
 'cupcake': None,
 'lollipop': None}

이전 섹션과 마찬가지로, 다음과 같이 딕셔너리를 다시 리스트로 변환할 수 있습니다.

unique_sweets = list(dict.fromkeys(sweets))
print(unique_sweets)
# 출력 결과
['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']

위의 출력 결과에서 중복 항목이 sweets 리스트에서 제거되었음을 알 수 있습니다.

요약 👩‍🏫

다음은 파이썬 리스트에서 중복된 항목 또는 반복을 제거하는 데 사용할 수 있는 다양한 방법들에 대한 요약입니다.

  • 파이썬 리스트 메서드인 .append()를 사용하여 반복되지 않는 항목들을 새로운 리스트에 추가합니다. 새로운 리스트는 원래 리스트의 각 항목을 정확히 한 번씩만 포함하고, 모든 반복을 제거합니다. 리스트 컴프리헨션을 사용하여 이 작업을 수행할 수도 있습니다.
  • 내장 메서드인 .count().remove()를 사용하여 정확히 두 번 나타나는 항목들을 제거합니다. while 루프를 사용하여 추가 발생들을 제거할 수도 있습니다.
  • 고유한 요소들만 유지하려면 파이썬 리스트를 세트로 캐스팅합니다.
  • 딕셔너리의 반복되는 키를 허용하지 않는다는 특성을 이용하여, dict.fromkeys(list)를 사용하여 리스트에서 중복을 제거합니다.

다음으로 파이썬 프로젝트를 확인하여 연습하고 학습하십시오. 또는 파이썬 리스트에서 항목의 인덱스를 찾는 방법을 알아보세요. 즐거운 학습 되세요!