Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 리스트에서 중복 요소를 제거하는 5가지 방법

리스트(List)는 파이썬에서 가장 중요한 컨테이너 자료형으로, 일상적인 프로그래밍은 물론 웹 개발에서도 거의 모든 코드에 사용됩니다. 사용 빈도가 높은 만큼 리스트의 다양한 연산 방법을 숙지하는 것이 필수적이며, 그중에서도 리스트에서 중복 요소를 제거하는 기능은 데이터 정제, 집합 연산 등 실무에서 매우 폭넓게 활용됩니다.

이 글에서는 파이썬으로 리스트의 중복을 제거할 수 있는 대표적인 5가지 방법을 예제 코드와 함께 살펴보겠습니다.

1. 반복문을 이용한 기본 방법 (Naive Method)

가장 직관적인 방식으로, 새로운 리스트에 아직 없는 값만 추가하면서 중복을 걸러냅니다. 원본 순서가 그대로 유지된다는 장점이 있습니다.

# 초기 리스트 생성
test_list = [1, 3, 5, 6, 3, 5, 6, 1]
print("원본 리스트 : " + str(test_list))

# 반복문으로 중복 제거
res = []
for i in test_list:
    if i not in res:
        res.append(i)

# 결과 출력
print("중복 제거 후 리스트 : " + str(res))

2. 리스트 컴프리헨션(List Comprehension) 활용

위의 반복문 로직을 한 줄로 압축한 방식입니다. 코드가 간결해지지만, 표현식 내부에서 append()를 호출하는 것은 가독성 측면에서 권장되지 않는다는 점을 참고하세요.

# 초기 리스트 생성
test_list = [1, 3, 5, 6, 3, 5, 6, 1]
print("원본 리스트 : " + str(test_list))

# 리스트 컴프리헨션으로 중복 제거
res = []
[res.append(x) for x in test_list if x not in res]

# 결과 출력
print("중복 제거 후 리스트 : " + str(res))

3. set() 함수 활용

파이썬의 set()은 본질적으로 중복을 허용하지 않는 자료형입니다. 리스트를 집합으로 변환한 뒤 다시 리스트로 만들면 중복이 자동으로 제거됩니다. 단, 원본 순서는 보장되지 않으므로 순서가 중요한 경우에는 주의해야 합니다.

# 초기 리스트 생성
test_list = [1, 5, 3, 6, 3, 5, 6, 1]
print("원본 리스트 : " + str(test_list))

# set()으로 중복 제거
test_list = list(set(test_list))

# 결과 출력
print("중복 제거 후 리스트 : " + str(test_list))

4. 리스트 컴프리헨션 + enumerate() 조합

enumerate()를 사용해 각 요소와 인덱스를 함께 확인하고, 현재 위치보다 앞부분에 같은 값이 없는 경우만 남기는 방식입니다. 순서를 유지하면서 중복을 제거할 수 있습니다.

# 초기 리스트 생성
test_list = [1, 5, 3, 6, 3, 5, 6, 1]
print("원본 리스트 : " + str(test_list))

# enumerate()를 활용한 중복 제거
res = [i for n, i in enumerate(test_list) if i not in test_list[:n]]

# 결과 출력
print("중복 제거 후 리스트 : " + str(res))

5. collections.OrderedDict.fromkeys() 활용

OrderedDict.fromkeys()는 딕셔너리 키의 중복을 허용하지 않으면서 삽입 순서를 유지하는 특성을 활용한 방법입니다. 순서 보존과 중복 제거를 동시에 달성할 수 있는 안정적인 기법입니다.

from collections import OrderedDict

# 초기 리스트 생성
test_list = [1, 5, 3, 6, 3, 5, 6, 1]
print("원본 리스트 : " + str(test_list))

# OrderedDict.fromkeys()로 중복 제거
res = list(OrderedDict.fromkeys(test_list))

# 결과 출력
print("중복 제거 후 리스트 : " + str(res))

실행 결과

원본 리스트 : [1, 3, 5, 6, 3, 5, 6, 1]
중복 제거 후 리스트 : [1, 3, 5, 6]
원본 리스트 : [1, 3, 5, 6, 3, 5, 6, 1]
중복 제거 후 리스트 : [1, 3, 5, 6]
원본 리스트 : [1, 5, 3, 6, 3, 5, 6, 1]
중복 제거 후 리스트 : [1, 3, 5, 6]
원본 리스트 : [1, 5, 3, 6, 3, 5, 6, 1]
중복 제거 후 리스트 : [1, 5, 3, 6]
원본 리스트 : [1, 5, 3, 6, 3, 5, 6, 1]
중복 제거 후 리스트 : [1, 5, 3, 6]

마치며

각 방법의 특징을 정리하면 다음과 같습니다.

  • 순서 유지가 필요하다면 → 반복문, enumerate() 조합, OrderedDict.fromkeys() 방식이 적합합니다.
  • 순서가 상관없고 성능이 중요하다면 → set() 변환이 가장 간단하고 빠릅니다.

참고로 파이썬 3.7 이상에서는 일반 dict도 삽입 순서를 유지하므로 list(dict.fromkeys(test_list))처럼 더 간결하게 작성할 수도 있습니다. 상황에 맞는 방법을 선택해 활용해 보시기 바랍니다.