데이터의 개수를 셀 때 매우 유용한 파이썬의 collections 모듈의 Counter 클래스에 대해서 알아보겠다.
collections 모듈의 Counter 클래스는 별도 패키지 설치 없이 파이썬만 설치되어 있다면 다음과 같이 임포트 해서 사용할 수 있다.
from collections import Counter
Counter 생성자는 여러 형태의 데이터를 인자로 받는데, 먼저 중복된 데이터가 저장된 리스트를 인자로 넘기면 각 원소가 몇 번씩 나오는지가 저장된 객체를 얻게 된다.
>>> Counter(["hi", "hey", "hi", "hi", "hello", "hey"])
Counter({'hi': 3, 'hey': 2, 'hello': 1})
Counter 생성자에 문자열을 인자로 넘기면 각 문자가 문자열에서 몇 번씩 나타나는지 알려주는 객체가 반환된다.
>>> Counter("hello world")
Counter({'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
collections 모듈의 Counter 클래스는 파이썬의 기본 자료구조인 사전(dictionary)를 확장하고 있기 때문에, 사전에서 제공하는 API를 그대로 사용할 수가 있다.
예를 들어, 대괄호를 이용하여 키로 값을 읽을 수도 있다.
counter = Counter('hello world')
counter['o'], counter['l'])
=> 2 3
특정 키에 해당하는 값을 갱신할 수도 있다.
counter['l'] += 1
counter['h'] -= 1
counter
=> Counter({'h': 0, 'e': 1, 'l': 4, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
if 문에서 in 키워드를 이용하여 특정 키가 카운터에 존재하는지 확인할 수 있다.
if 'o' in counter:
print('o in counter')
del counter['o']
if 'o' not in counter:
print('o not in counter')
Counter를 사용하는 것은 쉽지만 Counter를 만드는 것은 그만큼 간단하지 않다.
일반 사전을 이용하여 어떤 단어가 주어졌을 때 단어에 포함된 각 알파벳의 글자 수를 세어주는 함수를 작성해 보자.
def countLetters(word):
counter ={}
for letter in word:
if letter not in counter:
counter[letter] = 0
counter[letter] += 1
return counter
countLetters('hello world')
=> {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}
아마 실무에서 Counter가 가장 많이 사용되는 경우가 가장 많이 나온 데이터나 가장 적게 나온 데이터를 찾을때 일것이다.
Counter 클래스는 이와 같은 작업을 수월하게 해준다.
from collections import Counter
Counter('hello world').most_common()
=> [('l', 3), ('o', 2), ('h', 1), ('e', 1), (' ', 1), ('w', 1), ('r', 1), ('d', 1)]
이 메서드의 인자로 숫자 K를 넘기면 그 숫자 만큼만 리턴하기 때문에, 가장 개수가 많은 K개의 데이터를 얻을 수도 있다.
from collections import Counter
Counter('hello world').most_common(1)
=> [('l', 3)]
counter1 = Counter(["A", "A", "B"])
counter2 = Counter(["A", "B", "B"])
counter1 + counter2
=> Counter({'A': 3, 'B': 3})
counter1 - counter2
=> Counter({'A': 1})
뺄샘의 결과로 0이나 음수가 나온 경우에는 최종 카운터 객체에서 제외가 되니 이 부분 주의해야 한다.