from collections import Counter
print(Counter('hi python kkk')) # Counter({'k': 3, 'h': 2, ' ': 2, 'i': 1, 'p': 1, 'y': 1, 't': 1, 'o': 1, 'n': 1})
print(Counter([1,2,3,4,1,2,5,6,7,8,9,10])) #Counter({1: 2, 2: 2, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1})
print(Counter(((1,3), (1,3), (3,1)))) #Counter({(1, 3): 2, (3, 1): 1})
#Counter클래스는 데이터의 개수가 많은 순으로
#정렬된 리스트를 리턴하는 most_common이라는 메서드를 제공
print(Counter('hi python kkk').most_common()) #[('k', 3), ('h', 2), (' ', 2), ('i', 1), ('p', 1), ('y', 1), ('t', 1), ('o', 1), ('n', 1)]
print(Counter([1,2,3,4,1,2,5,6,7,8,9,10]).most_common()) #[(1, 2), (2, 2), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)]
print(Counter(((1,3), (1,3), (3,1))).most_common()) #[((1, 3), 2), ((3, 1), 1)]
#이 메서드의 인자로 숫자 K를 넘기면
#그 숫자 만큼만 리턴하기 때문에,
#가장 개수가 많은 K개의 데이터를 얻을 수도 있습니다.
print(Counter('hi python kkk').most_common(1)) # [('k', 3)]
print(Counter([1,2,3,4,1,2,5,6,7,8,9,10]).most_common(2)) #[(1, 2), (2, 2)]
print(Counter(((1,3), (1,3), (3,1))).most_common(3)) #[((1, 3), 2), ((3, 1), 1)] -> 개수 넘어가면 그냥 전체 출력
#Counter에서 존재하지 않는 키의 값의 default값은 0
#Counter에서 존재하지 않는 키의 값을 변경하면 키와 값이 생성됨
from collections import Counter
need = Counter(['A', 'C', 'C'])
print(need['B']) #0
missing = 7
missing -= need['C'] > 0 # a > b 하면 True(=1), False(=0)반환
print(missing) #6
missing -= need['K']
print(missing) #6
need['B'] -= 1
print(need) #Counter({'C': 2, 'A': 1, 'B': -1})
from collections import Counter
a_counter = Counter("AABC")
b_counter = Counter("BBBCC")
print(a_counter) #Counter({'A': 2, 'B': 1, 'C': 1})
print(b_counter) #Counter({'B': 3, 'C': 2})
#1. 두 카운터 +, - 연산
print(a_counter + b_counter) #Counter({'B': 4, 'C': 3, 'A': 2})
print(a_counter - b_counter) #Counter({'A': 2})
#=>+,-연산에서 값이 0 이하면 아이템을 목록에서 제거함
counter = Counter({'A': 3, 'B': 0, 'C': -1})
print(counter) #Counter({'A': 3, 'B': 0, 'C': -1})
counter += Counter({'C': 2})
print(counter) #Counter({'A': 3, 'C': 1})
counter += Counter({'C': -5})
print(counter) #Counter({'A': 3})
#2. subtract 메서드
# subtract([iterable-or-mapping])
a_counter.subtract(b_counter)
print(a_counter) #Counter({'A': 2, 'C': -1, 'B': -2})
a_counter += b_counter
print(a_counter) #원래 상채로 돌려놓음 a_counter = Counter({'A': 2, 'B': 1, 'C': 1})
a_counter.subtract('A')
print(a_counter) #Counter({'A': 1, 'B': 1, 'C': 1})
#3. &(교집합)과 |(합집합)
print(a_counter & b_counter) #Counter({'B': 1, 'C': 1})
print(a_counter | b_counter) #Counter({'B': 3, 'A': 2, 'C': 2})
#4. 메서드 elements(): 카운터 된 숫자만큼의 요소를 return
print(list(a_counter.elements())) ##Counter({'A': 2, 'B': 1, 'C': 1})
from collections import Counter
#빈 Counter()을 더하면 값이 0 이하인 아이템을 목록에서 아예 제거함
counter = Counter({'A': 3, 'B': 0, 'C': -1})
print(counter) #Counter({'A': 3, 'B': 0, 'C': -1})
counter += Counter()
print(counter) #Counter({'A': 3})