from collections import Counter
25 Jan 2023
collections
module에는 specialized container datatype들이 구현되어있다. 그 중에 Counter class에 대해 알아보려고 한다.
Counter는 dict subclass로, hashable object에 대해 개수를 세준다. Element가 key로, 각 element의 개수가 value로써 dictionary 값이 저장된다. Counter는 value로 음수와 0을 포함한 integer값이 올 수 있다.
>>> from collections import Counter
>>> c = Counter(['a','a','b','b','c','a'])
>>> c
Counter({'a': 3, 'b': 2, 'c': 1})
Counter object의 함수를 살펴보자.
-
elements() : value값 만큼 element들을 반환해주는 iterator를 반환한다.
>>> it = c.elements() >>> it <itertools.chain object at 0x7fb0aa5c6d90> >>> next(it) 'a' >>> next(it) 'a' >>> next(it) 'a' >>> next(it) 'b' >>> next(it) 'b' >>> next(it) 'c' >>> next(it) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>> it = c.elements() >>> sorted(it) ['a', 'a', 'a', 'b', 'b', 'c']
-
most_common(n=None) : n개의 가장 자주 등장하는 (elements, count) tuple형태의 list를 반환한다. n에 대해서 default = None이고, None일 떄는 모든 element로 구성되어 있는 tuple list를 반환한다.
>>> c.most_common(2) [('a', 3), ('b', 2)] >>> c.most_common() [('a', 3), ('b', 2), ('c', 1)]
-
substract(iterable or mapping or counter) : iterable or mapping으로부터 elements들을 빼준다.
>>> c2 = Counter(['a','c']) >>> c.subtract(c2) >>> c Counter({'a': 2, 'b': 2, 'c': 0})
-
total() : count의 합을 반환해 준다. → python 3.10에서부터 가능하다. (3.8 사용중)
Leetcode에서 621. Task Scheduler 문제를 파이썬으로 풀다가 정리한 내용이다. 여기에선 value간만 필요해서, values()로 반환해서 dict values 타입을 사용해서 풀었다. 혹시나 나중에 또 쓸일이 있을까봐 기록해 둔다.
from collections import Counter
class Solution(object):
def leastInterval(self, tasks, n):
"""
:type tasks: List[str]
:type n: int
:rtype: int
"""
c = Counter(tasks).values()
max_cnt = max(c)
part_cnt = max_cnt-1
max_freq = c.count(max_cnt)
empty_slots = part_cnt * (n-(max_freq-1))
available_tasks = len(tasks)- max_cnt * max_freq
idles = max(0, empty_slots - available_tasks)
answer = len(tasks) + idles
return answer