EXCELSIOR

collections 모듈 - Counter 본문

Python/자료구조

collections 모듈 - Counter

Excelsior-JH 2017. 8. 17. 00:10

collections.Counter()

컨테이너에 동일한 값의 자료가 몇개인지를 파악하는데 사용하는 객체이다.
docs.python.org에서 Counter함수에 대해 자세히 알아볼 수 있다.

A Counter is a dict subclass for counting hashable objects. It is an unordered collection where elements are stored as dictionary keys and their counts are stored as dictionary values. Counts are allowed to be any integer value including zero or negative counts. The Counter class is similar to bags or multisets in other languages.

collections.Counter()의 결과값(return)은 딕셔너리 형태로 출력된다.
아래의 예제 소스코드들을 통해 collections.Counter()에 대해 살펴보도록 하자.

1. Counter()의 다양한 입력값들

1) 리스트(List)

lst = ['aa', 'cc', 'dd', 'aa', 'bb', 'ee']의 요소 개수를 collections.Counter()를 이용하여 구할 수 있다. 출력 결과는 Dictionary형태로 반환하여 준다.

# collections.Counter (1)
# list
import collections
lst = ['aa', 'cc', 'dd', 'aa', 'bb', 'ee']
print(collections.Counter(lst))
'''
Counter({'aa': 2, 'cc': 1, 'dd': 1, 'bb': 1, 'ee': 1})
'''

2) 딕셔너리(Dictionary)

또한, collections.Counter()는 아래의 예제(2)에서 볼 수 있듯이 요소의 갯수가 많은 것 부터 출력해준다.
입력값은 Dictionary형태로 넣어주면, 결과값 또한 Dictionary이다.

# collections.Counter (2)
# dictionary
import collections
print(collections.Counter({'': 3, '': 2, '': 4}))
'''
Counter({'': 4, '': 3, '': 2})
'''

3) 값 = 개수 형태

collections.Counter()에는 값=개수형태로 입력이 가능하다.
예를들어, collections.Counter(a=2, b=3, c=2)['a', 'a', 'b', 'b', 'b', 'c', 'c']와 같다.
아래의 예제(3)의 출력값을 통해 확인할 수 있다.

# collections.Counter (3)
# '='
import collections
c = collections.Counter(a=2, b=3, c=2)
print(collections.Counter(c))
print(sorted(c.elements()))
'''
Counter({'b': 3, 'c': 2, 'a': 2})
['a', 'a', 'b', 'b', 'b', 'c', 'c']
'''

4) 문자열(String)

예제(4)에서 볼 수 있듯이, 문자열을 입력했을 경우 {문자 : 개수}의 딕셔너리 형태로 반환해 준다.

# collections.Counter (4)
# ''
import collections
container = collections.Counter()
container.update("aabcdeffgg")
print(container)
'''
Counter({'f': 2, 'g': 2, 'a': 2, 'e': 1, 'b': 1, 'c': 1, 'd': 1})
'''
for k,v in container.items():
print(k,':',v)
'''
f : 2
e : 1
b : 1
g : 2
c : 1
a : 2
d : 1
'''

2. Counter의 메소드(method)들

1) update()

Elements are counted from an iterable or added-in from another mapping (or counter). Like dict.update() but adds counts instead of replacing them. Also, the iterable is expected to be a sequence of elements, not a sequence of (key, value) pairs.

update()는 Counter의 값을 갱신하는 것을 의미한다. 딕셔너리의 update와 비슷하지만 입력값을 문자열 형태로도 입력 가능하다. 예제(5)는 입력값을 문자열로 했을때와 딕셔너리 형태로 입력했을 떄의 예제이다.

# collections.Counter (5)
# update()
import collections
#
a = collections.Counter()
print(a)
a.update("abcdefg")
print(a)
'''
Counter()
Counter({'f': 1, 'e': 1, 'b': 1, 'g': 1, 'c': 1, 'a': 1, 'd': 1})
'''
#
a.update({'f':3, 'e':2})
print(a)
'''
Counter({'f': 4, 'e': 3, 'b': 1, 'g': 1, 'c': 1, 'a': 1, 'd': 1})
'''

2) elements()

Return an iterator over elements repeating each as many times as its count. Elements are returned in arbitrary order. If an element’s count is less than one, elements() will ignore it.

입력된 값의 요소에 해당하는 값을 풀어서 반환한다. 요소는 무작위로 반환하며, 요소 수가 1보다 작을 경우 elements는 이를 출력하지 않는다. 예제(5)는 "Hello Python"의 문자열을 elements()를 사용하여 출력한 결과이다. elements()는 대소문자를 구분하며, sorted()를 이용하여 정렬해줄 수 있다.

# collections.Counter (6)
# elements()
import collections
c = collections.Counter("Hello Python")
print(list(c.elements()))
print(sorted(c.elements()))
'''
['n', 'h', 'l', 'l', 't', 'H', 'e', 'o', 'o', ' ', 'y', 'P']
[' ', 'H', 'P', 'e', 'h', 'l', 'l', 'n', 'o', 'o', 't', 'y']
'''
c2 = collections.Counter(a=4, b=2, c=0, d=-2)
print(sorted(c.elements()))
'''
['a', 'a', 'a', 'a', 'b', 'b']
'''

3) most_common(n)

Return a list of the n most common elements and their counts from the most common to the least. If n is omitted or None, most_common() returns all elements in the counter. Elements with equal counts are ordered arbitrarily

most_common은 입력된 값의 요소들 중 빈도수(frequency)가 높은 순으로 상위 n개를 리스트(list) 안의 투플(tuple) 형태로 반환한다. n을 입력하지 않은 경우, 요소 전체를 [('값', 개수)]의 형태로 반환한다.

# collections.Counter (7)
# most_common()
import collections
c2 = collections.Counter('apple, orange, grape')
print(c2.most_common())
print(c2.most_common(3))
'''
[('a', 3), ('p', 3), ('e', 3), ('g', 2), (',', 2), ('r', 2), (' ', 2), ('n', 1), ('l', 1), ('o', 1)]
[('a', 3), ('p', 3), ('e', 3)]
'''

4) subtract()

Elements are subtracted from an iterable or from another mapping (or counter). Like dict.update() but subtracts counts instead of replacing them. Both inputs and outputs may be zero or negative.

subtract()는 말 그대로 요소를 빼는것을 의미한다. 다만, 요소가 없는 경우는 음수의 값이 출력된다. 예제(7)에서 문자열 'hello python' 에서 'i love python' 을 subtract()를 이용해서 빼주게 되면 'hello python'에 존재하지 않는 'i, v'는 음수가 나타나게 된다.

# collections.Counter (8)
# subtract()
import collections
c3 = collections.Counter('hello python')
c4 = collections.Counter('i love python')
c3.subtract(c4)
print(c3)
'''
Counter({'l': 1, 'h': 1, 'n': 0, 't': 0, 'p': 0, 'e': 0, 'o': 0, 'y': 0, 'i': -1, 'v': -1, ' ': -1})
'''
c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4)
c.subtract(d)
print(c)
'''
Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
'''

3. Counter를 이용한 연산

collections.Counter()는 산술/집합 연산이 가능하다.

1) 덧셈(+)

# collections.Counter (9)
# Counter
import collections
a = collections.Counter(['a', 'b', 'c', 'b', 'd', 'a'])
b = collections.Counter('aaeroplane')
print(a)
print(b)
print(a+b)
'''
Counter({'b': 2, 'a': 2, 'd': 1, 'c': 1})
Counter({'a': 3, 'e': 2, 'n': 1, 'r': 1, 'o': 1, 'p': 1, 'l': 1})
Counter({'a': 5, 'b': 2, 'e': 2, 'n': 1, 'l': 1, 'd': 1, 'r': 1, 'o': 1, 'p': 1, 'c': 1})
'''

2) 뺄셈(-)

Counter의 뺄셈은 음수값은 출력하지 않는다.

# collections.Counter (10)
# Counter
import collections
a = collections.Counter('aabbccdd')
b = collections.Counter('abbbce')
print(a-b)
'''
Counter({'d': 2, 'c': 1, 'b': 1, 'a': 1})
'''

3) 교집합(&) 과 합집합(|)

Counter의 교집합 및 합집합의 출력값은 {값 : 개수}의 딕셔너리 형태로 반환된다.

# collections.Counter (11)
# Counter
import collections
a = collections.Counter('aabbccdd')
b = collections.Counter('aabbbce')
print(a & b)
'''
Counter({'b': 2, 'a': 2, 'c': 1})
'''
print(a | b)
'''
Counter({'b': 3, 'c': 2, 'd': 2, 'a': 2, 'e': 1})
'''


'Python > 자료구조' 카테고리의 다른 글

내장함수 zip() 과 itertools.zip_longest() 함수  (0) 2017.09.21
collections 모듈 - OrderedDict  (0) 2017.09.07
collections 모듈 - namedtuple  (5) 2017.08.22
collections 모듈 - deque  (3) 2017.08.20
collections 모듈 - defaultdict  (0) 2017.08.18
Comments