파이썬에서 항목의 개수를 셀때 사용하는 클래스로 Counter라는게 있다.
리스트나 셋을 인자로 넘기면 각 항목을 키로 해서 개수를 알려준다.
기본사용법은 이렇다.
>>> from collections import Counter >>> letters = 'bbibbi' >>> c = Counter(letters) >>> c Counter({'b': 4, 'i': 2}) |
깔끔하지 아니한가?
항목의 수를 세기 위해 키값을 초기화하고, 키가 있으면 1증가시키고, 루프돌고...
그런거 없이 Counter만 쓰면 답이 딱 나온다.
출력순서도 값이 큰것부터 내림차순으로 나온다.
>>> Counter('abbcccdddd') Counter({'d': 4, 'c': 3, 'b': 2, 'a': 1}) >>> Counter('abbcccddddaaaa') Counter({'a': 5, 'd': 4, 'c': 3, 'b': 2}) |
기존에 defaultdict()를 이용해서 세는것과 비교해보자.
>>> letters = 'dongdongfather'
>>> letters_dict = defaultdict(int)
>>> for k in letters:
... letters_dict[k] += 1 #키에 대한 값이 없으면 값을 0으로 초기화
...
>>> letters_dict
defaultdict(<class 'int'>, {'d': 2, 'o': 2, 'n': 2, 'g': 2, 'f': 1, 'a': 1, 't': 1, 'h': 1, 'e': 1, 'r': 1})
코드를 보면 Counter가 얼마나 작업을 쉽게 해주는지 알 수 있다.
이것외에도 할 수 있는 작업이 여러가지가 있다.
1. 상위요소 반환 : most_common()
most_common() 메서드를 사용하면 인자만큼 상위요소를 출력할 수 있다. 인자를 주지 않으면 전체요소가 출력된다.
>>> Counter('abbcccddddaaaa').most_common(1) # 상위요소 하나출력 [('a', 5)] >>> Counter('abbcccddddaaaa').most_common(2) # 상위요소 두개출력 [('a', 5), ('d', 4)] |
2. 두 카운터를 더하기(+), 빼기(-)
>>> acounter = Counter(['kim','jung','kim','kim']) >>> bcounter = Counter(['roh','kim','kim']) >>> acounter Counter({'kim': 3, 'jung': 1}) >>> bcounter Counter({'kim': 2, 'roh': 1}) >>> acounter - bcounter Counter({'kim': 1, 'jung': 1}) >>> acounter + bcounter Counter({'kim': 5, 'jung': 1, 'roh': 1}) |
acountrer와 bcounter를 더하면 각각 'kim'의 3과 2가 더해져 5가 되고, 'jung'의 1과 'roh'의 1이 더해진다.
acountrer와 bcounter를 빼면 acounter의 'kim' 값 3에서 bcounter의 'kim'값 2가 빼져서 'kim'값은 1이된다.
'jung'값 1은 빼는값이 없어서 그대로 'jung':1로 들어가고, bcounter의 'roh'값은 acounter에 값이 없기때문에 연산에서 제외된다.
3. subtract() 메서드
subtract() 메서드는 각 요소의 값을 각각 빼준다.
그렇기때문에 각 요소의 값이 마이너스(-)가 될 수 있다.
>>> a = Counter(a=5, b=3) >>> b = Counter(b=5, c=2) >>> a.subtract(b) >>> a Counter({'a': 5, 'b': -2, 'c': -2}) # a = 5 - 0 , b = 3 - 5, c = 0 - 2 |
4. &(교집합)과 |(합집합)
Counter 객체는 교집합과 합집합 연산이 가능하다.
>>> a = Counter(a=5, b=3) >>> b = Counter(b=2, c=4) >>> a&b Counter({'b': 2}) >>> a|b Counter({'a': 5, 'c': 4, 'b': 3}) |
a&b 는 교집합이기때문에 공통된 'b'값 중 작은값인 2가 나왔고
a|b는 합집합이기때문에 전체 항목이 다 출력되고, 중복되는 항목인 'b'는 큰 값 3이 출력되었다.
5. 카운터 숫자만큼 요소 반환 : elements()
Counter에 elements() 메서드를 사용하면 카운터 된 숫자만큼의 요소를 리턴받을 수 있다.
>>> cnt = Counter(a=5,b=3) >>> cnt Counter({'a': 5, 'b': 3}) >>> list(cnt.elements()) ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b'] >>> list(cnt) ['a', 'b'] |
Counter객체 cnt에 'a'가 5, 'b'가 3으로 세팅되어 있다.
이것을 elements()로 변환하여 리스트로 변환하면 ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b']와 같이 리턴받을 수 있다.
list(cnt)와 같이 Counter 객체를 바로 리스트로 변환하면 키값인 'a','b'만 리스트의 항목으로 변환된다.
'IT' 카테고리의 다른 글
[파이썬 기초] 스택과 큐의 기능을 한번에 deque (1) | 2018.11.23 |
---|---|
[파이썬 기초] 순서지정된 딕셔너리 OrderedDict() (0) | 2018.11.22 |
[파이썬 기초] 딕셔너리 값 가져오기 get(), setdefault() (0) | 2018.11.21 |
[파이썬 기초] print() 함수에서 % 와 format()를 사용하여 서식에 맞게 출력(1) (1) | 2018.11.02 |
[파이썬 기초] print() 함수 (0) | 2018.11.02 |