코딩 테스트 문제를 풀다 보면 문자열이나 배열의 요소 빈도 계산에 Counter라는 collections 모듈의 클래스를 사용하는 경우를 종종 확인할 수 있습니다.
Counter 클래스의 주요 특징과 사용법에 대해 알아보도록 하겠습니다.
- 생성 예시 및 설명
from collections import Counter # 문자열로부터 생성 c1 = Counter('gallahad') print(c1) # Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1}) # 리스트로부터 생성 c2 = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue']) print(c2) # Counter({'blue': 3, 'red': 2, 'green': 1}) # 딕셔너리로부터 생성 c3 = Counter({'red': 4, 'blue': 2}) print(c3) # Counter({'red': 4, 'blue': 2}) # 키워드 인자로 생성 c4 = Counter(cats=4, dogs=8) print(c4) # Counter({'dogs': 8, 'cats': 4})
- collections 모듈은 실제로 Python의 내장 모듈입니다. 따라서 Counter 클래스도 Python에 내장되어 있습니다.
정확히 설명하자면:- collections는 Python의 내장 모듈입니다.
- Counter는 이 내장 모듈의 일부입니다.
- 그러나 Counter는 list, dict, str 등과 같은 내장 타입(built-in types)과는 다릅니다.
내장 모듈인 collections에 포함되어 있기 때문에, Python을 설치할 때 Counter도 함께 설치됩니다. 따라서 별도의 설치 과정 없이 사용할 수 있습니다.
다만, Counter를 사용하기 위해서는 여전히 from collections import Counter와 같은 import 문이 필요합니다.
- 생성되는 결과를 보면 키-쌍 값을 가지는 딕셔너리형과 같다는 것을 알 수 있습니다.
이는 Counter가 dict를 상속받은 서브클래스이기 때문입니다. 다음은 Counter 객체의 주요 특징입니다.- 딕셔너리와 유사한 구조: 키-값 쌍을 가집니다.
- 딕셔너리의 서브클래스이기 때문에 딕셔너리의 모든 기능을 가지면서 딕셔너리 메서드를 사용 가능합니다.
- 또한, Counter는 딕셔너리의 기능을 확장하여 요소의 개수를 세는 데 특화된 추가 기능을 제공합니다.
- most_common() 메서드나 elements() 메서드 등은 Counter 클래스에서 추가로 제공하는 기능입니다.
- 키는 세고자 하는 항목이고, 값은 그 항목의 개수입니다.
- 존재하지 않는 키에 접근해도 KeyError를 발생시키지 않고 0을 반환합니다.
- collections 모듈은 실제로 Python의 내장 모듈입니다. 따라서 Counter 클래스도 Python에 내장되어 있습니다.
- 요소 접근 및 수정
c = Counter(['eggs', 'ham']) print(c['bacon']) # 0 c['apple'] = 1 print(c) # Counter({'eggs': 1, 'ham': 1, 'apple': 1})
- 앞서 설명했듯이, Counter 객체는 딕셔너리처럼 동작하며, 존재하지 않는 키에 대해 KeyError를 발생시키지 않고 0을 반환합니다.
- 가장 흔한 요소 찾기
c = Counter('abracadabra') print(c.most_common(3)) # [('a', 5), ('b', 2), ('r', 2)]
- most_common() 메서드는 Counter 클래스에서 추가로 제공하는 기능이라 설명했었습니다.
주요 특징은 아래와 같습니다.- 요소와 그 개수를 (요소, 개수) 형태의 튜플 리스트로 반환합니다.
- 기본적으로 개수가 많은 순서대로 정렬되어 반환합니다.
- 개수가 같은 요소들의 순서는 처음 등장한 순서를 따릅니다.
- 선택적으로 인자 n을 받아, 상위 n개의 가장 흔한 요소만 반환할 수 있습니다.
- 인자를 지정하지 않거나, None을 전달하면 모든 요소를 반환합니다.
- most_common() 메서드는 Counter 클래스에서 추가로 제공하는 기능이라 설명했었습니다.
- 산술 연산
c1 = Counter(a=3, b=1) c2 = Counter(a=1, b=2) print(c1 + c2) # Counter({'a': 4, 'b': 3}) print(c1 - c2) # Counter({'a': 2}) print(c1 & c2) # Counter({'a': 1, 'b': 1}) print(c1 | c2) # Counter({'a': 3, 'b': 2})
- Counter 객체들 간에 덧셈, 뺄셈, 교집합, 합집합 연산이 가능합니다.
- 요소의 총 개수
c = Counter(a=4, b=2, c=0, d=-2) print(sum(c.values())) # 4
- sum() 함수를 사용하여 모든 요소의 개수 합을 구할 수 있습니다.
- 요소 제거
c = Counter(a=4, b=2, c=0, d=-2) del c['a'] c['b'] -= 1 print(c) # Counter({'b': 1, 'c': 0, 'd': -2})
- 특정 요소를 제거하거나 개수를 줄일 수 있습니다.
이런 Counter 클래스는 코딩 테스트에서 문자열이나 리스트의 요소 빈도를 빠르게 계산해야 할 때 매우 유용합니다.
# 이 글의 내용 중 일부는 Perplexity AI의 도움을 받아 정보를 수집하고 정리하였으며, 추가적인 연구와 개인적인 견해를 더하였습니다.
'파이썬 관련 문법' 카테고리의 다른 글
병합 정렬 쉽게 배우기: 재귀 호출과 병합 과정을 시각적으로 따라가기 (0) | 2024.12.12 |
---|---|
파이썬의 양방향 큐, deque 사용법 (1) | 2024.12.11 |
이진 탐색이란 무엇인가? (0) | 2024.12.10 |
ValueError를 피하는 방법: 두 코드의 결과 분석하기 (0) | 2024.12.10 |
파이썬의 구조분해 할당: 코드를 간결하고 강력하게 (0) | 2024.12.10 |