파이썬 리스트에서 중복 요소 제거하는 8가지 방법
리스트는 정수, 문자열, 커스텀 객체 등 순서가 있는 아이템 컬렉션을 담는 파이썬의 기본 데이터 구조입니다. 다른 언어의 배열에 해당합니다.
아래는 순서 보존과 가독성을 유지하면서 리스트에서 중복 요소를 제거하는 검증된 기법들입니다.
- set을 사용한 중복 제거
- 임시 리스트를 사용한 중복 제거
- OrderedDict(또는 dict.fromkeys) 사용
- 단순 for-루프 사용
- 리스트 컴프리헨션 사용
- NumPy의 unique() 사용
- Pandas의 unique() 사용
- enumerate()와 리스트 컴프리헨션 조합
set을 사용한 중복 제거
파이썬 내장 set() 함수는 고유한 요소만 반환하여 중복을 제거합니다. 리스트를 set으로 변환한 뒤 다시 리스트로 변환하여 컬렉션 형태를 유지합니다.
my_list = [1,1,2,3,2,2,4,5,6,2,1]
my_final_list = set(my_list)
print(list(my_final_list))
출력:
[1, 2, 3, 4, 5, 6]
임시 리스트를 사용한 중복 제거
빈 리스트를 생성하고 원본 리스트를 순회하며 아직 보지 못한 항목만 추가하는 방식입니다.
my_list = [1, 2, 3, 1, 2, 4, 5, 4 ,6, 2]
print("List Before ", my_list)
temp_list = []
for i in my_list:
if i not in temp_list:
temp_list.append(i)
my_list = temp_list
print("List After removing duplicates ", my_list)
출력:
List Before [1, 2, 3, 1, 2, 4, 5, 4, 6, 2]
List After removing duplicates [1, 2, 3, 4, 5, 6]
OrderedDict(또는 dict.fromkeys) 사용
파이썬 3.5+에서는 일반 dict가 삽입 순서를 보존하므로 dict.fromkeys()로 고유 값을 순서대로 유지할 수 있습니다.
my_list = ['a','x','a','y','a','b','b','c']
my_final_list = dict.fromkeys(my_list)
print(list(my_final_list))
출력:
['a', 'x', 'y', 'b', 'c']
단순 for-루프로 중복 제거
리스트를 순회하며 이전에 나타나지 않은 항목만 새 리스트에 추가합니다.
my_list = [1,2,2,3,1,4,5,1,2,6]
myFinallist = []
for i in my_list:
if i not in myFinallist:
myFinallist.append(i)
print(myFinallist)
출력:
[1, 2, 3, 4, 5, 6]
리스트 컴프리헨션으로 중복 제거
리스트 컴프리헨션은 간결한 문법으로 가독성을 유지합니다.
my_list = [1,2,2,3,1,4,5,1,2,6]
my_finallist = []
[my_finallist.append(n) for n in my_list if n not in my_finallist]
print(my_finallist)
출력:
[1, 2, 3, 4, 5, 6]
NumPy의 unique()로 중복 제거
NumPy의 unique() 함수는 배열의 정렬된 고유 요소를 반환합니다.
import numpy as np
my_list = [1,2,2,3,1,4,5,1,2,6]
myFinalList = np.unique(my_list).tolist()
print(myFinalList)
출력:
[1, 2, 3, 4, 5, 6]
Pandas의 unique()로 중복 제거
Pandas도 리스트류 객체에서 작동하는 가벼운 unique() 메서드를 제공합니다.
import pandas as pd
my_list = [1,2,2,3,1,4,5,1,2,6]
myFinalList = pd.unique(my_list).tolist()
print(myFinalList)
출력:
[1, 2, 3, 4, 5, 6]
enumerate()와 리스트 컴프리헨션으로 중복 제거
enumerate()와 리스트 컴프리헨션을 결합하면 각 요소의 첫 출현을 보존하면서 중복을 제거할 수 있습니다.
my_list = [1,2,2,3,1,4,5,1,2,6]
my_finallist = [i for j, i in enumerate(my_list) if i not in my_list[:j]]
print(my_finallist)
출력:
[1, 2, 3, 4, 5, 6]
요약
set() 사용이 중복 제거에 가장 빠르지만 순서를 보존하지 않습니다.
- 임시 리스트나 for-루프는 원래 순서를 유지하지만 약간 덜 간결합니다.
- 순서 있는 딕셔너리나
dict.fromkeys()는 순서를 보존하면서 매우 효율적입니다.
- NumPy와 Pandas는 수치 데이터나 DataFrame 중심 워크플로에 원라이너 솔루션을 제공합니다.
enumerate()를 활용한 리스트 컴프리헨션은 읽기 쉽고 순서 보존적인 함수형 스타일을 제공합니다.