본문 바로가기
Python/알고리즘팁

파이썬 Counter 객체 사용하기

by 붕어사랑 티스토리 2021. 3. 12.
반응형

docs.python.org/3/library/collections.html#collections.Counter

 

collections — Container datatypes — Python 3.9.2 documentation

collections — Container datatypes Source code: Lib/collections/__init__.py This module implements specialized container datatypes providing alternatives to Python’s general purpose built-in containers, dict, list, set, and tuple. namedtuple() factory f

docs.python.org

 

알고리즘 풀 때 유용한 파이썬의 Counter 객체를 정리해보려 한다.

 

  • Counter는 dict의 서브클래스이다. 이름에서 알 수 있듯이 요소의 갯수를 세어준다.
  • key 와 value 형태로 저장된다. key는 요소이고, value는 요소의 갯수이다.
  • 덧셈 뺄셈 연산이 가능하다.

 

 

객체 생성방법

 

>>> c = Counter("abcde") #문자열을 넣어주면 문자요소로 Counting
>>> c
Counter({'a': 1, 'b': 1, 'c': 1, 'd': 1, 'e': 1})

>>> c = Counter({'red':4,'blue':2}) #dict객체를 넣어주면 dict 그대로 count를 만들어준다
>>> c
Counter({'red': 4, 'blue': 2})


>>> c = Counter({'red':'a','blue':'b'}) #value를 문자로 넣어봤는데 문자그대로 나온다... 이렇게 쓸일 없으니 주의
>>> c
Counter({'blue': 'b', 'red': 'a'})

>>> c=Counter(cats=4,dogs=8) #이렇게 넣어주니 알아서 keyword로 변환해줌
>>> c
Counter({'dogs': 8, 'cats': 4})

>>> c = Counter(['eggs','ham']) #리스트를 넣어주면 리스트 요소를 카운팅해줌
>>> c
Counter({'eggs': 1, 'ham': 1})

 

 

 

요소 찾기

 

dictionary 자료형과 방법이 똑같다. 값이 있을경우 value를 리턴해주며 없을경우 0을 리턴한다.

>>> c = Counter(['eggs','ham'])
>>> c
Counter({'eggs': 1, 'ham': 1})
>>> c['eggs']
1
>>> c['beaf']
0

 

 

 

요소 지우기

 

값을 0으로 만들어준다고 지워지지 않는다. del을 이용하여 지워주자

>>> c['eggs'] = 0
>>> c
Counter({'ham': 1, 'eggs': 0})
>>> del c['eggs']
>>> c
Counter({'ham': 1})

 

 

사칙연산

 

+  : 합집합

-   : 차집합

&  : 교집합에서 min value

|   :  교집합에서  max value

 

Counter({'a': 3, 'b': 2})
>>> c = Counter(a=3, b=1)
>>> d = Counter(a=1, b=2)
>>> c + d
Counter({'a': 4, 'b': 3})
>>> c - d
Counter({'a': 2})  // 양수값만 살아남는다
>>> c & d
Counter({'a': 1, 'b': 1})  // min(c[x],d[x]) 두 값중 작은값만 살아남는다
>>> c | d
Counter({'a': 3, 'b': 2})  // max(c[x],d[x]) 두 값중 큰값만 살아남는다

 

 

 

 

 

 

most_common 함수

 

가장 많이 나오는 요소들을 반환해준다. 인풋으로 주는 숫자는 원하는 요소의 갯수이다.

 

Counter('abracadabra').most_common(3)
[('a', 5), ('b', 2), ('r', 2)]
>>> Counter('abracadabra').most_common(1)
[('a', 5)]
>>> Counter('abracadabra').most_common(2)
[('a', 5), ('b', 2)]

 

반응형

댓글