심심해서 하는 블로그 :: 'Tip' 카테고리의 글 목록

'Tip'에 해당되는 글 1건

[Python] List 중복제거

Tip 2019. 1. 4. 00:38
리스트 중복 제거

리스트 중복 제거

필요에 따라서 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와 같이 변환하는 해줍니다.




실행 결과를 보면 중복이 타입에 따라 제거가 된 것을 확인할 수 있습니다.

사실 이 정도 중복을 제거 해야 하는 일이 많지는 않습니다만 이렇게도 할 수 있다 정도만 참고하시면 될 거 같습니다.


긴 글 읽어 주셔서 감사합니다.

공감 버튼은 작성자에게 큰 동기 부여가 됩니다.



,