Counter()

  1. 데이터의 갯수를 count할 때 사용함.
  2. 주로 리스트나 튜플, 문자열의 원소의 수를 count할 때 사용함.
  3. 파이썬의 collections 모듈의 Counter클래스를 사용한다.
  4. 결과값은 딕셔너리 형태로 return함
  5. 일반적인 딕셔너리 형태처럼 key값을 보고 싶으면 .keys()을 쓴다. value값을 보고 싶을 땐 .values()를 쓴다.
    하지만 print 될때는 dict_keys(), dict_values() 형태로 나오기 때문에 값들만 보고 싶으면 list() 를 쓰면 됨. 만약 keys() 혹은 values()없이 딕셔너리 형태일때 list를 쓰면 key값을 출력함
    .items()를 쓰면 (key, value)형태의 튜플을 원소로 하는 리스트를 출력함. 다만, dict_items() 형 태로 출력함. 값들만 출력하고 싶을 때는 list()를 쓴다.

리스트의 원소 count

from collections import Counter

data = [2, 2, 2, 1, 1, 3, 3, 4]

make_dict = Counter(data)



print(make_dict)
>>> Counter({2: 3, 1: 2, 3: 2, 4: 1})

print(make_dict.keys())
>>> dict_keys([2, 1, 3, 4])

print(list(make_dict.keys()))
>>> [2, 1, 3, 4]

print(make_dict.values())
>>> dict_values([3, 2, 2, 1])

print(list(make_dict.values()))
>>> [3, 2, 2, 1]

print(list(make_dict))
>>>  [2, 1, 3, 4]  # Counter()에 list()를 쓰면 key값을 출력함

print(make_dict.items())
>>> dict_items([(2, 3), (1, 2), (3, 2), (4, 1)])  # (key, value)

print(list(make_dict.items()))
>>> [(2, 3), (1, 2), (3, 2), (4, 1)]

 

문자열 원소 count

from collections import Counter

s = "hello python"

make_dict = Counter(s)

print(make_dict)
>>> Counter({'h': 2, 'e': 1, 'l': 2, 'o': 2, ' ': 1, 'p': 1, 'y': 1, 't': 1, 'n': 1})

print(make_dict.keys())
>>> dict_keys(['h', 'e', 'l', 'o', ' ', 'p', 'y', 't', 'n'])

print(list(make_dict.keys()))
>>> ['h', 'e', 'l', 'o', ' ', 'p', 'y', 't', 'n']

print(make_dict.values())
>>> dict_values([2, 1, 2, 2, 1, 1, 1, 1, 1])

print(list(make_dict.values()))
>>> [2, 1, 2, 2, 1, 1, 1, 1, 1]

print(make_dict.items())
>>> dict_items([('h', 2), ('e', 1), ('l', 2), ('o', 2), (' ', 1), ('p', 1), ('y', 1), ('t', 1), ('n', 1)])

 

most_common() : 빈도수가 높은 상위 원소들을 (key, value) 형태로 반환

⇒ ()를 쓰는걸 주의하자! 안쓰면 bound method Counter.most_common of Counter와 함께 (key, value)쌍으로 출력되지 않음

from collections import Counter

Counter('abbbbbbcccddddaaaa')
>>> Counter({'a': 5, 'b': 6, 'c': 3, 'd': 4})

Counter('abbbbbbcccddddaaaa').most_common(1)  # 빈도수가 가장 높은 하나만 출력함
>>> [('b', 6)]

Counter('abbbbbbcccddddaaaa').most_common(2)   # 빈도수가 가장 높은 두개만 출력함
>>> [('b', 6), ('a', 5)]

Counter('abbbbbbcccddddaaaa').most_common()    # most_common()안에 인자를 안써주면 모든 key값을 value값의 빈도순으로 나열함
>>> [('b', 6), ('a', 5), ('d', 4), ('c', 3)]

Counter('abbbbbbcccddddaaaa').most_common  # ()를 안써줬을 때
>>> <bound method Counter.most_common of Counter({'b': 6, 'a': 5, 'd': 4, 'c': 3})>

 

두 count를 더하기(+), 뺴기 (-) : value값을 더하거나 뺀다.(주의! 합집합, 차집합과 다름)

from collections import Counter

answer1 = Counter(['kim', 'park', 'kim', 'kim'])
print(answer1)
>>> Counter({'kim': 3, 'park': 1})

answer2 = Counter(['Jung', 'kim', 'kim'])
print(answer2)
>>> Counter({'kim': 2, 'Jung': 1})

print(answer1 +answer2)
>>> Counter({'kim': 5, 'park': 1, 'Jung': 1})

print(answer1 - answer2)
>>> Counter({'kim': 1, 'park': 1})

print(answer2 - answer1)
>>> Counter({'Jung': 1}) # count가 마이너스가 되는 것은 결과에서 뺌

 

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

from collections import Counter

answer1 = Counter(['kim', 'park', 'kim', 'kim'])
print(answer1)
>>> Counter({'kim': 3, 'park': 1})

answer2 = Counter(['Jung', 'kim', 'kim'])
print(answer2)
>>> Counter({'kim': 2, 'Jung': 1})


print(answer1 & answer2)
>>> Counter({'kim': 2})

print(answer1 | answer2)
>>> Counter({'kim': 3, 'park': 1, 'Jung': 1})

 

a.substract(b)

Counter()의 객체인 a에서 b의 count 값을 뺌. 단 이때는 위에서 빼기(-)와 달리 Count에 음수가 들어갈 수 있음. 단 이때는 빼기(-)와 달리 다시 값을 출력 해야만 결과가 보임

from collections import Counter

answer1 = Counter(kim=3 ,park=1)  # 위와 같은 결과임. ''을 안쓰는 것 주의. 위와 달리 리스트를 안쓰는 것에 주의!
print(answer1)
>>> Counter({'kim': 3, 'park': 1})

answer2 = Counter(kim=2, Jung=1)  # 위와 같은 결과임. ''을 안쓰는 것 주의. 위와 달리 리스트를 안쓰는 것에 주의!
print(answer2)
>>> Counter({'kim': 2, 'Jung': 1})

answer1.subtract(answer2)
print(answer1)
>>> Counter({'kim': 1, 'park': 1, 'Jung': -1})

answer2.subtract(answer1)
print(answer2)
>>> Counter({'kim': -1, 'Jung': 1, 'park': -1})

 

elements() 

카운트된 수만큼 원소를 반환. 단, 결과를 <itertools.chain at 0x7f0cffe49610> 형태로 출력하기 때문에 값을 보고 싶으면 list()를 해준다. 단, count된게 음수이면 출력하지 않는다.

cnt = Counter('abbbbbbcccddddaaaa')
print(cnt.elements())
>>>  <itertools.chain object at 0x7f0cf7e54cd0>

print(list(cnt.elements()))
>>>  ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd']
from collections import Counter

answer1 = Counter(kim=5 ,park=2) 
answer2 = Counter(kim=2, Jung=1)
answer1.subtract(answer2)
print(answer1)
>>> Counter({'kim': 3, 'park': 2, 'Jung': -1})


print(list(answer1.elements()))
>>>  ['kim', 'park', 'park']

 

dictionary를 이용하여 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}

+ Recent posts