Counter()
- 데이터의 갯수를 count할 때 사용함.
- 주로 리스트나 튜플, 문자열의 원소의 수를 count할 때 사용함.
- 파이썬의 collections 모듈의 Counter클래스를 사용한다.
- 결과값은 딕셔너리 형태로 return함
- 일반적인 딕셔너리 형태처럼 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}