728x90
1. 기존 리스트의 순서를 유지하지 않고 요소의 중복만 제거하려는 경우
보통 파이썬에서 리스트이 중복을 제거할 때 주로 쓰는 방법은 set( ) 함수를 사용해 중복이 없는 자료형인 집합 자료형으로 변환 후 다시 리스트로 바꾼다.
그러나..
이는 기존 리스트의 순서를 고려하지 않아, 기존 리스트의 순서가 필요한 경우에는 사용하지 못한다.
origin_data = ["1", "1", "3", "5", "3", "7", "2", "7", "9", "8", "9"]
print(list(set(origin_data)))
# ['2', '7', '3', '9', '1', '5', '8']
set( ) 함수를 이용해 list 자료형을 set 자료형으로 바꾼 후, 다시 list 자료형으로 변환한다.
set은 중복을 허용하지 않고, 내부 값이 순서가 존재하지 않는 집합이기 때문에, set으로 바꾸는 과정에서 인덱스가 없어졌다 랜덤으로 다시 리스트가 재구성된다.
2. 기존 리스트의 순서를 유지하고 중복을 제거하려는 경우
1) 딕셔너리 사용
파이썬 3.7 이상부터 딕셔너리는 키 값의 순서를 기억한다.
fromkeys( )를 사용해 딕셔너리를 생성하고, value값을 지정하지 않은 후, 리스트로 묶어준다.
# 생성할 키 목록 전달
dict.fromkeys(origin_data)
# {'1': None, '3': None, '5': None, '7': None, '2': None, '9': None, '8': None}
# 생성할 키와 value 값 전달
dict.fromkeys(origin_data, "test")
# {'1': 'test', '3': 'test', '5': 'test', '7': 'test', '2': 'test', '9': 'test', '8': 'test'}
dict.fromkeys(origin_data, [0, 1])
# {'1': [0, 1], '3': [0, 1], '5': [0, 1], '7': [0, 1], '2': [0, 1], '9': [0, 1], '8': [0, 1]}
########
list(dict.fromkeys(origin_data))
# ['1', '3', '5', '7', '2', '9', '8']
2) sorted( ) 사용
주어진 리스트를 set으로 바꾸고, sorted로 정렬하는데, 정렬순서를 지정해준다.
이 때, 정렬순서는 리스트 원소의 인덱스를 사용한다.
sorted(set(origin_data), key=lambda x: origin_data.index(x))
# ['1', '3', '5', '7', '2', '9', '8']
3) for 반복문 사용
for문을 활용해 기존 리스트에서 중복을 제거한 새 리스트를 만든다.
new_data2 = [i for n, i in enumerate(origin_data) if i not in origin_data[:n]]
# ['1', '3', '5', '7', '2', '9', '8']
####### 단순 for문
arr = [6, 5, 6, 4, 4, 1, 1, 2, 3, 9, 8, 7, 9, 8, 7]
result = [] # 중복 제거된 값들이 들어갈 리스트
for value in arr:
if value not in result:
result.append(value)
print(result)
# [6, 5, 4, 1, 2, 3, 9, 8, 7]
# 중복이 제거되며, 원본 리스트의 순서 유지
4) colletcions 라이브러리의 OrderedDict 사용
OrderedDict 모듈을 사용하면 리스트 컴프리헨션보다도 더 빠르게 접근하여 중복을 제거한다.
from collections import OrderedDict
list(OrderedDict.fromkeys(origin_data))
# ['1', '3', '5', '7', '2', '9', '8']
728x90
'PYTHON' 카테고리의 다른 글
[PYTHON] 문자/숫자인지 확인하기 - isalpha, isdigit, isalnum (0) | 2024.03.02 |
---|---|
[PYTHON] 분수 표현, 사칙연산 - Fraction (0) | 2024.02.22 |
[PYTHON] 공백 및 문자 제거 함수 - strip, rstrip, lstrip (1) | 2024.02.08 |
[PYTHON] 문자열을 식으로 계산해주는 함수 - eval (0) | 2024.02.08 |
[PYTHON] 뒤에서부터 찾기 - rfind, rindex (0) | 2024.02.06 |