본문 바로가기
Python

collections.Counter() (파이썬 클래스)

by yororing 2024. 10. 7.

00 개요

  • 빈도수를 쉽게 반환해주는 Counter() 클래스에 대한 정리

01 Counter() 클래스란

1. 정의

  • Python의 collections 모듈에 포함된 클래스 중 하나
  • list, tuple, string 등에서 요소의 빈도를 쉽게 계산할 수 있는 기능 제공, 해시 가능한 객체의 횟수를 셈
  • dict 자료형을 확장한 형태 → dict의 서브클래스
  • 요소key로, 빈도(i.e., 등장 횟수, 0 또는 음수 가능)를 value로 저장함
    • 즉, {'요소1': 빈도, '요소2': 빈도, ...}

2. 문법

  • from collections import Counter
  • Counter([iterable-or-mapping])
  • 예시
from collections import Counter

string_1 = ‘PearlAhnHello’
cntr = Counter(string_1)
print(cntr)
>>> Counter({'l': 3, 'e': 2, 'P': 1, 'a': 1, 'r': 1, 'A': 1, 'h': 1, 'n': 1, 'H': 1, 'o': 1})

list_1 = [‘apple’, ‘banana’, ‘lemon’, ‘grape’, ‘apple’, ‘lemon’, ‘lemon’]
cntr = Counter(list_1)
print(cntr)
>>> Counter({'lemon': 3, 'apple': 2, 'banana': 1, 'grape': 1})
# Counter를 dict 형태로 변환
print(dict(cntr))
>>> {'apple': 2, 'banana': 1, 'lemon': 3, 'grape': 1}

3. 주요 기능

  • 요소의 개수 세기: Counter()는 입력받은 iterable한 객체(리스트, 문자열, 튜플 등) 안의 각 요소가 몇 번 등장했는지를 계산해 줌
  • 딕셔너리처럼 동작: Counter()는 기본적으로 딕셔너리와 비슷한 방식으로 동작함, 각 요소를 key, 빈도를 value로 저장
  • 가장 많이 등장한 요소 찾기: most_common() 메서드를 사용해 가장 많이 등장한 요소 확인 가능

4. Counter()의 메소드

1) most_common([n])

  • most_common() 메소드는 가장 빈도가 높은 요소들을 빈도 순서대로 반환
  • 선택적으로 상위 n개의 항목만 반환 가능
  • Usage: 빈도가 높은 항목을 찾거나 상위 몇 개만 필요한 경우 매우 유용
from collections import Counter
l
data = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
counter = Counter(data)

# 빈도수 상위 2개의 요소 반환
print(counter.most_common(2))
>>> [('apple', 3), ('banana', 2)]
  • 설명:
    • 빈도순 정렬: 요소가 빈도수에 따라 내림차순으로 반환됨
    • 상위 n개만 선택: 인자로 n을 넣으면 상위 n개의 항목만 반환되며, n을 생략하면 전체가 반환됨

2) elements() 

  • elements() 메소드는 Counter 객체에서 요소를 등장한 횟수만큼 반복해 반환하는 iterator를 제공
  • Usage: 모든 항목을 등장한 횟수만큼 반복해야 할 때 유용
from collections import Counter

counter = Counter(a=3, b=1, c=2, d=4, e=0, f=-1)

# 각 요소를 등장한 횟수만큼 반복해 반환
print(list(counter.elements()))
>>> ['a', 'a', 'a', 'b', 'c', 'c', 'd', 'd', 'd', 'd']
  • 설명:
    • 등장 횟수만큼 요소 반복: 'a'가 3번 등장했으므로 'a'는 3번 반환됨
    • 0 또는 음수는 무시: 등장 횟수가 0 이하인 요소는 반환되지 않음 

3) subtract([iterable-or-mapping])

  • subtract() 메소드는 다른 iterable이나 mapping의 요소 수를 사용하여 현재 Counter 객체에서 해당 요소의 수를 뺌 → 반환값 없음, 현재 Counter 객체 변경
  • 이는 추가가 아닌 감소를 수행하는 점에서 update()와 반대 역할을 함
  • Usage: 두 데이터셋의 차이를 구하거나 수량을 감소시키고 싶을 때 유용
from collections import Counter

counter = Counter(a=4, b=2, c=0)
counter.subtract({'a':2, 'b':1, 'c':1})

print(counter)
>>> Counter({'a':2, 'b':1, 'c':-1})
  • 설명:
    • 수량 감소: subtract() 는 요소의 개수를 뺌
    • 음수 처리: 감소한 결과가 음수가 될 수 있으며, 이는 요소의 수가 더 적다는 것을 나타냄

4) update([iterable-or-mapping]) 

  • update() 메소드는 Counter 객체의 요소 개수를 증가시킴
  • 입력으로 주어진 iterable 또는 mapping에 있는 요소들을 현재 카운터에 추가  → 반환값 없음, 현재 Counter 객체 변경
  • Usage: 데이터를 추가하거나 합산할 때 유용
from collections import Counter

counter = Counter(a=4, b=1, c=2, d=-1)
counter.update(['a', 'a', 'b', 'c', 'd', 'd'])
# counter.update({'a':2, 'b':1, 'c':1, 'd':2})    # alternative

print(counter)
>>> Counter({'a':6, 'c':3, 'b':2, 'd':1})
  • 설명:
    • 수량 증가: update()는 Counter에 요소를 추가하거나 개수를 더함
    • iterable 지원: list, tuple, dict 등 다양한 iterable 자료형 사용 가능

5) clear()

  • clear() 메소드는 Counter 객체의 모든 요소를 제거하여 비움
  • 이후 객체는 빈 상태가 됨
  • Usage: Counter를 초기화하고 싶을 때 유용
from collections import Counter

counter = Counter(a=4, b=2)
counter.clear()

print(counter)
>>> Counter()
  • 설명:
    • 모든 요소 제거: Counter 객체에 저장된 모든 요소가 제거되며 빈 Counter() 객체가 됨