어제 오늘 내일

[Python 기초] "똑같은 데이터 다 나와!" 파이썬 리스트 중복 제거 완벽 가이드 (순서 유지 vs 순서 무시) 본문

IT/Python

[Python 기초] "똑같은 데이터 다 나와!" 파이썬 리스트 중복 제거 완벽 가이드 (순서 유지 vs 순서 무시)

hi.anna 2026. 4. 16. 01:43

수만 건의 크롤링 데이터나 설문조사 결과를 취합하다 보면, 필연적으로 중복된 데이터가 섞여 들어옵니다. 파이썬에서는 이 중복 데이터를 아주 쉽게 날려버릴 수 있습니다.

오늘은 데이터의 '순서'를 중요하게 생각하느냐 마느냐에 따라 골라 쓸 수 있는 리스트 중복 제거의 3가지 비법을 소개해 드립니다.


1. 가장 쉽고 빠른 방법: set() 활용하기 (순서 섞임 주의)

파이썬에서 중복을 제거할 때 가장 먼저 떠올려야 할 마법의 단어는 바로 집합(set)입니다. 집합 자료형은 태생적으로 "같은 값을 두 번 허용하지 않는다"는 강력한 규칙을 가지고 있습니다.

📌 예제 코드: set()으로 중복 날리기

# 중복이 섞여 있는 원본 리스트
raw_data = ["사과", "바나나", "사과", "딸기", "바나나", "포도"]

# 1. 리스트를 집합(set)으로 변환하면 알아서 중복이 날아갑니다.
unique_set = set(raw_data)

# 2. 다루기 편하게 다시 리스트(list)로 되돌려줍니다.
clean_list = list(unique_set)

print("원본:", raw_data)
print("중복 제거 후:", clean_list)
# 출력 예시: ['딸기', '포도', '바나나', '사과']

💡 이 방법의 특징:

  • 장점: 코드가 가장 짧고, 실행 속도도 압도적으로 빠릅니다. list(set(데이터)) 한 줄이면 끝납니다.
  • 단점: 집합은 '순서'라는 개념이 없습니다. 따라서 위 출력 예시처럼 데이터가 원래 리스트에 있던 순서와 완전히 다르게 뒤죽박죽 섞여버립니다. (순서가 상관없을 때만 쓰세요!)

2. 전통적이고 직관적인 방법: for 반복문 사용하기 (순서 유지)

"데이터가 들어온 순서를 무조건 지켜야 해요!"
이럴 때 초보자분들이 가장 이해하기 쉬운 직관적인 방법은 바로 빈 바구니를 하나 만들고, 원래 바구니에서 하나씩 꺼내보며 "새 바구니에 이 값이 이미 있나?" 확인하는 것입니다.

📌 예제 코드: for문과 in 연산자로 중복 걸러내기

raw_data = ["사과", "바나나", "사과", "딸기", "바나나", "포도"]

# 중복을 제거한 데이터를 담을 '새로운 빈 바구니'를 만듭니다.
clean_list = []

for item in raw_data:
    # 만약 새 바구니(clean_list) 안에 이 과일(item)이 '없다면(not in)'
    if item not in clean_list:
        clean_list.append(item)  # 새 바구니에 추가합니다.

print("중복 제거 후 (순서 유지):", clean_list)
# 출력: ['사과', '바나나', '딸기', '포도'] 
# (원본에서 처음 등장했던 순서가 그대로 유지됨!)

💡 이 방법의 특징:

  • 장점: 논리가 아주 명확해서 누구나 코드를 읽고 이해하기 쉽습니다. 원래 데이터의 순서도 완벽하게 지켜줍니다.
  • 단점: 데이터가 100만 개쯤 되면, 매번 새 바구니를 뒤져봐야 하므로 컴퓨터가 처리하는 속도가 꽤 느려집니다.

3. 파이썬 고수들의 실무 방식: dict.fromkeys() (순서 유지 + 빠른 속도)

순서도 유지하고 싶고, 속도도 빠르게 처리하고 싶다면 어떻게 해야 할까요?
파이썬 개발자들이 실무에서 가장 사랑하는 우아한 방법은 바로 딕셔너리(Dictionary)의 성질을 이용하는 것입니다.

딕셔너리의 이름표(Key)는 절대 중복될 수 없다는 특징을 활용합니다. 파이썬 3.7 버전부터는 딕셔너리가 데이터가 입력된 순서를 기억하도록 업그레이드되었기 때문에 가능한 꼼수이자 정석입니다.

📌 예제 코드: 딕셔너리를 활용한 스마트한 중복 제거

raw_data = ["사과", "바나나", "사과", "딸기", "바나나", "포도"]

# 1. dict.fromkeys()를 쓰면 리스트의 값들이 딕셔너리의 'Key'로 들어갑니다.
# (이 과정에서 중복된 Key는 무시되고, 처음 들어온 순서는 기억됩니다.)
dict_data = dict.fromkeys(raw_data)

# 2. 만들어진 딕셔너리를 다시 리스트로 감싸줍니다.
clean_list = list(dict_data)

# 실무에서는 보통 위 과정을 한 줄로 씁니다: 
# clean_list = list(dict.fromkeys(raw_data))

print("중복 제거 후 (고수 방식):", clean_list)
# 출력: ['사과', '바나나', '딸기', '포도']

💡 이 방법의 특징:

  • 장점: 코드가 단 한 줄로 깔끔하며, 원래 순서를 완벽하게 유지하면서도 for문을 쓰는 것보다 실행 속도가 훨씬 빠릅니다. (현재 파이썬에서 가장 권장되는 방식입니다.)

📝 마치며

리스트 중복 제거의 3가지 방법 요약입니다.

  1. 순서가 섞여도 상관없을 때 (가장 빠름): list(set(데이터))
  2. 순서를 지켜야 하고, 직관적인 코드가 좋을 때: for문과 not in 사용
  3. 순서를 지키면서, 실무에서 가장 세련되게 쓸 때: list(dict.fromkeys(데이터))

이제 중복 데이터가 산더미처럼 쌓여있어도 당황하지 않고 상황에 맞는 칼을 꺼내 드실 수 있겠죠?

 

반응형
Comments