파이썬에서리스트를 중복 제거하는 방법
때로는 파이썬에서는 값 목록이 있는데 그중 일부는 중복입니다.
목록에서 모든 중복 항목을 제거하는 일상적인 사용 사례이므로
목록의 나머지 모든 값은 고유합니다.
우리는 다른 방법을 사용하여 이것을 달성 할 수 있습니다.
요소의 원래 순서, 다른 요소는 그렇지 않습니다.
순서를 유지하지 않고 파이썬리스트 중복 제거
원래 주문을 보존 할 필요가없는 경우,
내장 된 set
데이터 구조를 사용하여 목록을 중복 제거 할 수 있습니다.
set
은 설계 상 고유 한 요소 만 포함 할 수있는 데이터 구조입니다.
초기 목록에서 이러한 ‘세트’를 구성함으로써 모든 중복 요소
무시됩니다.
그런 다음 세트를 다시 목록으로 변환하고 고유 한 요소 목록을 얻습니다.
불행히도 중복 제거 이후 요소의 순서가 변경됩니다.
set
데이터 구조의 기능은 해시 테이블을 사용하여 구현됩니다.
어느 요소가 먼저 삽입되었는지 기억하지 마십시오.
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique_set = set(names)
>>> unique_list = list(unique_set)
>>> unique_list
['Stacy', 'Sarah', 'Jim', 'Bob']
Python 의 과학 컴퓨팅에 NumPy 패키지를 사용하는 경우,
numpy.unique()
함수를 사용할 수도 있습니다.
>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> numpy.unique(names).tolist()
['Bob', 'Jim', 'Sarah', 'Stacy']
위의 방법은 원래 요소 순서를 유지하지 않습니다.
순서를 유지하는 NumPy
방식이 더 복잡하며 아래에서 찾을 수 있습니다.
순서를 유지하면서 파이썬리스트 중복 제거
초기 순서를 유지하는 간단한 솔루션은 이중 for-each 루프를 사용하는 것입니다.
첫 번째 루프는 원래 목록의 모든 요소를 순회합니다.
두 번째 루프는 동일한 값을 가진 요소를 이미 보았는지 확인합니다.
그렇지 않은 경우 ‘고유 한’목록에 추가합니다.
원래 순서대로 고유 한 요소를 포함합니다.
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = []
>>> for name in names: # 1st loop
... if name not in unique: # 2nd loop
... unique.append(name)
...
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']
원래 순서를 유지하면서 목록을 중복 제거하는 또 다른 방법은
collections.OrderedDict
데이터 구조.
OrderedDict
는 파이썬에서 특별한 종류의 사전 데이터 구조입니다.
키 삽입 순서를 기억합니다.
>>> from collections import OrderedDict
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = list(OrderedDict.fromkeys(names))
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']
Pandas Python 데이터 분석 라이브러리를 사용하는 경우
pandas.unique
도 도움이 될 수 있습니다. 이 방법은 주문 보존입니다.
>>> import pandas
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> pandas.unique(names).tolist()
['Bob', 'Stacy', 'Sarah', 'Jim']
NumPy 의 순서를 유지하면서 목록을 중복 제거하는 방법은 조금 더 복잡합니다.
각 개별 요소의 색인을 기억 한 다음 고유 목록을 다시 작성해야합니다.
이러한 색인을 사용하여 원래의 색인에서
>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> _, indexes = numpy.unique(names, return_index=True)
>>> unique = [names[i] for i in numpy.sort(indexes)]
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']