HOWTO · Python
Python 목록에서 고유 값 계산
Python 목록에서 고유 값 계산
이 페이지의 내용
Python 목록의 고유 값 개수는 len(set(values))로 간단히 구할 수 있습니다. 목록의 항목은 해시 가능해야 하며, 숫자와 문자열, 모든 요소가 해시 가능한 튜플이 이에 해당합니다. 각 값이 몇 번 나타나는지도 알아야 한다면 collections.Counter를 사용해 한 번에 고유 값의 개수와 값별 빈도를 구할 수 있습니다. 데이터가 이미 NumPy 배열에 저장되어 있다면 numpy.unique가 적합합니다. 이 글에서는 세 가지 방법과 상황에 맞는 선택 기준을 살펴봅니다.
set()로 고유 값 세기
내장 set() 함수는 목록을 집합으로 변환하며, 집합에는 각 고유 값이 한 번씩만 저장됩니다. 결과를 len()으로 감싸면 모듈을 추가로 가져오지 않고도 고유 값의 개수를 구할 수 있습니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
values = [1, 2, 2, 3, 4, 4, 5]
unique_values = set(values)
print(len(unique_values))
출력:
5
set(values)는 중복된 2와 4를 제거하고, len()은 남은 요소의 개수를 반환합니다. 입력 항목은 해시 가능해야 합니다. 목록이나 딕셔너리처럼 해시할 수 없는 항목이 포함되면 Python에서 TypeError가 발생합니다. 또한 집합은 목록의 원래 순서를 유지하지 않으므로 고유 값이 몇 개인지는 알 수 있지만 어떤 값이 먼저 나왔는지는 알 수 없습니다. 처음 나타난 순서대로 고유 값을 얻으려면 list(dict.fromkeys(values))를 사용하세요. 이 결과의 길이도 같은 고유 값 개수입니다.
collections.Counter로 고유 값 세기
collections.Counter는 이터러블의 각 항목이 몇 번 나타나는지 세는 딕셔너리형 클래스입니다. 고유 값의 개수와 각 값의 빈도를 함께 알고 싶을 때 적합합니다. 코드와 출력에 표시되는 과일 이름은 바이트 단위로 동일하게 유지되므로 영어로 표시됩니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
from collections import Counter
values = ["apple", "banana", "apple", "orange", "banana", "kiwi"]
counter = Counter(values)
print(len(counter))
print(dict(counter))
출력:
4
{'apple': 2, 'banana': 2, 'orange': 1, 'kiwi': 1}
counter는 각 값을 해당 빈도에 연결하므로 len(counter)는 고유 키의 개수를 셉니다. 이 목록에는 키가 네 개 있습니다. counter["apple"]처럼 인덱싱하면 해당 값의 빈도를 확인할 수 있고, counter.most_common(1)은 가장 자주 나타나는 항목을 반환합니다. set()와 마찬가지로 collections.Counter도 해시 가능한 항목에 사용할 수 있으며 Python 표준 라이브러리에 포함되어 있습니다.
NumPy로 고유 값 세기
NumPy는 서드파티 패키지이며 pip install numpy로 설치할 수 있습니다. 이 패키지의 numpy.unique 함수는 배열과 유사한 입력에서 정렬된 고유 값을 반환합니다. 반환된 결과의 크기가 고유 값 개수이며, return_counts=True를 전달하면 각 값의 빈도도 함께 반환합니다.
다음 예제의 코드와 숫자 출력은 변경되지 않은 채 표시됩니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import numpy as np
values = np.array([1, 2, 2, 3, 4, 4, 5])
unique_values, counts = np.unique(values, return_counts=True)
print(len(unique_values))
for value, count in zip(unique_values, counts):
print(value, count)
출력:
5
1 1
2 2
3 1
4 2
5 1
여기서 unique_values에는 정렬된 고유 숫자 다섯 개가 들어 있고, counts에는 각 숫자의 출현 횟수가 들어 있습니다. 2와 4는 각각 두 번 나타납니다. numpy.unique는 결과를 정렬하므로 고유 값을 순서대로 얻어야 할 때도 적합합니다. 데이터가 이미 NumPy 배열에 있거나 NumPy를 사용 중이라면 이 방법을 선택하세요. 일반 Python 목록에는 set()를 사용하면 추가 의존성이 필요하지 않습니다.
상황에 맞는 방법 선택하기
세 방법 모두 같은 고유 값 개수를 반환합니다. 따라서 입력 형태와 추가로 필요한 정보에 맞춰 선택하세요.
- 해시 가능한 항목의 고유 개수만 필요하고 표준 라이브러리만 사용하는 간단한 방법을 원한다면
set()를 사용하세요. - 각 값의 빈도, 가장 자주 나타나는 항목 또는 값별 집계도 필요하다면
collections.Counter를 사용하세요. - 데이터가 이미 NumPy 배열에 있거나 정렬된 고유 값이 필요하다면
numpy.unique를 사용하세요. 빈도를 얻으려면return_counts=True를 전달합니다.
어떤 방법을 선택할지는 개수 자체보다 빈도나 정렬된 결과가 필요한지, 추가 의존성을 피하고 싶은지에 따라 달라집니다. 고유 개수는 세 방법 모두 같은 방식으로 구합니다.