본문 바로가기
프로그래밍 언어/Python 3

[Python] 리스트 중복 제거 (순서 유지 X, 순서 유지 O)

by Physics 2020. 12. 29.
728x90

Python에서 리스트의 중복을 제거하는 경우, 크게 두 가지 경우를 생각해볼 수 있다. 

• 리스트의 중복만을 제거하는 경우 ( 기존 리스트의 순서는 고려 x) 
• 리스트의 중복을 제거하되 기존 리스트의 순서는 유지 

문제의 예시로써, 아래와 같이 중복이 있는 데이터가 존재한다고 가정하자.

>>> dup_list = ['1','3','6','5','5','3','4','4','3','2','2','2','1']

1. 리스트의 중복만을 제거하는 경우

기존 리스트의 순서는 고려하지 않고 중복만을 제거하는 경우에는 Python의 set 자료형을 이용하면 된다. 

※ Python의 set 자료형의 특징은 아래와 같다. 
   1) 중복을 허용하지 않음 (Removing Duplicated) 
   2) Set 내부에 있는 값들은 순서가 존재하지 않음 (Unordered)
※ Set 자료형에 대한 documentary: https://docs.python.org/2/library/sets.html

- Set 자료형을 이용하는 경우

>>> list(set(dup_list))
['4', '2', '5', '1', '6', '3']

2. 리스트의 중복을 제거하되 기존 리스트의 순서를 유지하는 경우

리스트의 중복을 제거하되 기존 리스트의 순서를 유지하는 방법에는 여러가지 방법들이 존재한다. 그 중 대표적인 4가지 방법을 설명하고자 한다. 해당 방법들에 대한 자세한 설명은 다음 레퍼런스를 참고하기 바란다 [5].

1)  Python의 Dictionary를 이용하는 방법

 Python 3.7 이상의 버전부터 dictionary는 "key"값을 넣는 순서를 기억한다. 따라서, dict을 이용해서 가장 간단한 방법으로 리스트의 중복을 제거하면서 기존 리스트의 순서를 유지할 수 있다. [6,7]

>>> list(dict.fromkeys(dup_list))
['1', '3', '6', '5', '4', '2']

 

2) Sorted() 함수를 이용하는 방법 

주어진 리스트를 Sorted 함수로 정렬하되 정렬 순서 (또는 키)는 원소의 인덱스로 사용한다. 

>>> sorted(set(dup_list), key = lambda x: dup_list.index(x))
['1', '3', '6', '5', '4', '2']

 

3) Collection package의 OrderedDict을 이용하는 방법

- OrderedDict과 list comprehension를 통한 접근 방법을 비교하는 경우, OrderedDict의 속도가 훨씬 더 빠르다.
- python 3.5에서는 OrderedDict을 이용한 접근방법이 가장 빠르다는데 확인이 필요할 것 같다. 

>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(dup_list))
['1', '3', '6', '5', '4', '2']

 

4) For 구문을 이용하는 방법 

for 구문을 이용하여 기존 리스트에서 중복을 제거한 새로운 리스트를 만든다. 

>>> newlist = []
>>> for x in dup_list:
...    	if x not in newlist:
...    	 	newlist.append(x)
>>> print(newlist)
['1', '3', '6', '5', '4', '2']

Reference
[1] https://bluese05.tistory.com/13 
[2] https://yangyang1201.tistory.com/126
[3] https://zereight.tistory.com/209 
[4] https://www.delftstack.com/ko/howto/python/how-to-deduplicate-a-list-in-python/
[5] https://stackoverflow.com/questions/480214/how-do-you-remove-duplicates-from-a-list-whilst-preserving-order/39835527#39835527
[6] https://mail.python.org/pipermail/python-dev/2017-December/151283.html
[7] https://stackoverflow.com/questions/39980323/are-dictionaries-ordered-in-python-3-6

728x90

댓글