IT

[파이썬 기초] Counter를 이용한 항목 계산

생각파워 2018. 11. 22. 07:15

파이썬에서 항목의 개수를 셀때 사용하는 클래스로 Counter라는게 있다.

리스트나 셋을 인자로 넘기면 각 항목을 키로 해서 개수를 알려준다.

 

기본사용법은 이렇다.

 

>>> from collections import Counter
>>> letters = 'bbibbi'
>>> c = Counter(letters)
>>> c
Counter({'b': 4, 'i': 2})

 

깔끔하지 아니한가?

항목의 수를 세기 위해 키값을 초기화하고, 키가 있으면 1증가시키고, 루프돌고...

그런거 없이 Counter만 쓰면 답이 딱 나온다.

출력순서도 값이 큰것부터 내림차순으로 나온다.

 

 >>> Counter('abbcccdddd')
Counter({'d': 4, 'c': 3, 'b': 2, 'a': 1})
>>> Counter('abbcccddddaaaa')


Counter({'a': 5, 'd': 4, 'c': 3, 'b': 2})

 

기존에 defaultdict()를 이용해서 세는것과 비교해보자.

>>> letters = 'dongdongfather'

>>> letters_dict = defaultdict(int)

>>> for k in letters:

...             letters_dict[k] += 1                    #키에 대한 값이 없으면 값을 0으로 초기화                     

...

>>> letters_dict

 

defaultdict(<class 'int'>, {'d': 2, 'o': 2, 'n': 2, 'g': 2, 'f': 1, 'a': 1, 't': 1, 'h': 1, 'e': 1, 'r': 1})


코드를 보면 Counter가 얼마나 작업을 쉽게 해주는지 알 수 있다.

이것외에도 할 수 있는 작업이 여러가지가 있다.

 

1. 상위요소 반환 : most_common()

most_common() 메서드를 사용하면 인자만큼 상위요소를 출력할 수 있다. 인자를 주지 않으면 전체요소가 출력된다.

 

 >>> Counter('abbcccddddaaaa').most_common(1)        # 상위요소 하나출력
[('a', 5)]
>>> Counter('abbcccddddaaaa').most_common(2)        # 상위요소 두개출력
[('a', 5), ('d', 4)]

 

 

2. 두 카운터를 더하기(+), 빼기(-)

 

 >>> acounter = Counter(['kim','jung','kim','kim'])
>>> bcounter = Counter(['roh','kim','kim'])
>>> acounter
Counter({'kim': 3, 'jung': 1})
>>> bcounter
Counter({'kim': 2, 'roh': 1})
>>> acounter - bcounter
Counter({'kim': 1, 'jung': 1})
>>> acounter + bcounter
Counter({'kim': 5, 'jung': 1, 'roh': 1})

 

acountrer와 bcounter를 더하면 각각 'kim'의 3과 2가 더해져 5가 되고, 'jung'의 1과 'roh'의 1이 더해진다.

acountrer와 bcounter를 빼면 acounter의 'kim' 값 3에서 bcounter의 'kim'값 2가 빼져서 'kim'값은 1이된다. 

'jung'값 1은 빼는값이 없어서 그대로 'jung':1로 들어가고, bcounter의 'roh'값은 acounter에 값이 없기때문에 연산에서 제외된다.

 

3. subtract() 메서드

subtract() 메서드는 각 요소의 값을 각각 빼준다.

그렇기때문에 각 요소의 값이 마이너스(-)가 될 수 있다.

>>> a = Counter(a=5, b=3)
>>> b = Counter(b=5, c=2)
>>> a.subtract(b)
>>> a
Counter({'a': 5, 'b': -2, 'c': -2})                     # a = 5 - 0 , b = 3 - 5, c = 0 - 2

 

4. &(교집합)과 |(합집합)

Counter 객체는 교집합과 합집합 연산이 가능하다.

>>> a = Counter(a=5, b=3)
>>> b = Counter(b=2, c=4)
>>> a&b
Counter({'b': 2})
>>> a|b
Counter({'a': 5, 'c': 4, 'b': 3}) 

 

a&b 는 교집합이기때문에 공통된 'b'값 중 작은값인 2가 나왔고

a|b는 합집합이기때문에 전체 항목이 다 출력되고, 중복되는 항목인 'b'는 큰 값 3이 출력되었다.

 

5. 카운터 숫자만큼 요소 반환 : elements()

Counter에 elements() 메서드를 사용하면 카운터 된 숫자만큼의 요소를 리턴받을 수 있다.

>>> cnt = Counter(a=5,b=3)
>>> cnt
Counter({'a': 5, 'b': 3})
>>> list(cnt.elements())
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b']
>>> list(cnt)
['a', 'b']

 

Counter객체 cnt에 'a'가 5, 'b'가 3으로 세팅되어 있다.

이것을 elements()로 변환하여 리스트로 변환하면 ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b']와 같이 리턴받을 수 있다.

list(cnt)와 같이 Counter 객체를 바로 리스트로 변환하면 키값인 'a','b'만 리스트의 항목으로 변환된다.

 

 

 

반응형