리스트 중복 제거
필요에 따라서 List 등의 중복 제거를 해야하는 경우가 있는데요.
다양한 데이터 타입에서 중복을 제거하는 방법에 대하여 알아보도록 합시다.
일반적인 경우
Python에는 set
자료형을 기본적으로 제공합니다.
set
은 수학에서 사용하는 집합의 개념으로 중복된 원소를 가지지 않는 것이 특징입니다.
set
타입은 list
타입과 Type Cast가 가능한 타입인데 이 점을 이용하여 중복을 제거 하는 것이 가능합니다.
dup_list = ['1', '1', '1', '4', '5', 5]
remove_dup = list(set(dup_list))
print(remove_dup)
다만 '5'
와 5
처럼 타입이 서로 다른 경우에는 중복을 제거를 하지 않습니다.
만약 리스트 안에 리스트가 있는 경우에 이 방법을 사용하면 어떤 결과가 발생할까요?
원소가 list로 이루어져 있는 경우
dup_list = [[1,2], [1,2], [1]]
remove_dup = list(set(dup_list))
print(remove_dup)
이 소스 코드를 실행하면 에러가 발생합니다. Hash를 지원하지 않는 list를 사용하였기 때문입니다.
다행히 tuple
의 경우에는 hash를 지원합니다
list
를 모두 tuple
타입으로 변환한 후 중복 제거를 시도합니다.
dup_list = [[1,2], [1,2], [1]]
remove_dup = list(set(map(tuple, dup_list)))
print(remove_dup)
하지만 이 방법은dup_list=[1, [1, 1], [1, 1]]
과 같이 uniterable element이 포함된 list의 경우 tuple()
로 변환이 되지 않습니다.
list 이외의 다양한 타입이 있다면, 약간 야매(?) 방법이 있긴 한데..
타입이 다양하면 str으로 변환 해보자.
import ast
def convert_str(x):
if type(x) is str:
return "'" + x + "'"
else:
return str(x)
dup_list = [1, '1', [2, 3], [2, 3], [2, '3'], {2, 3}, (2, 3)]
remove_dup = list(map(ast.literal_eval, set(map(convert_str, dup_list))))
print(remove_dup)
원소들을 모두 문자열로 바꾼 후 set을 취합니다.
다만, str
타입의 경우에는 앞뒤로 따옴표를 추가해줍니다.
그 후 ast.literal_eval()로 str으로 변환된 것들을 다시 원래 데이터 타입으로 변환해줍니다.
참고로 ast.literal_eval() 함수는 () -> tuple, {} -> set / dict, [] -> list, '' -> str
와 같이 변환하는 해줍니다.
실행 결과를 보면 중복이 타입에 따라 제거가 된 것을 확인할 수 있습니다.
사실 이 정도 중복을 제거 해야 하는 일이 많지는 않습니다만 이렇게도 할 수 있다 정도만 참고하시면 될 거 같습니다.
긴 글 읽어 주셔서 감사합니다.
공감 버튼은 작성자에게 큰 동기 부여가 됩니다.