프로그래머스 문제를 풀고 다른 사람들의 풀이를 보다가 collections의 Counter를 사용하여 딕셔너리를 이용해 푸는 문제를 두문 장정도로 깔끔하게 풀어내는 것을 보고 저 라이브러리는 뭘까 하며 알아보았다.
1. collections
1.1 collections
collections모듈은 파이썬에서 일반적으로 제공되고 있는 dict, list, set, tuple의 대안을 제공해주는 특별한 데이터 컨테이너들의 집합이다. 큐를 이용하는 구현을 할 때 사용하는 deque 역시 collections 모듈에서 사용할 수 있다. collections 모듈에는 활용도 높아 보이는 container들이 많이 보였는데 오늘은 그중 Counter에 대해 공부해 보았다.
2. Counter
2.1 Counter
Counter는 해시 가능한 객체를 세는 데 사용하는 딕셔너리 서브 클래스이다. 여기서 해시란 다양한 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑한다는 것이다.(이를 이용하여 특정한 배열의 인덱스나 위치, 위치를 입력하여 데이터의 값을 지정하거나 찾을 수 있다.) 즉, 해시가능한해시 가능한 객체라는 의미는 고정된 길이를 가진 데이터로 매핑이 가능한 데이터라는 뜻이고, 파이썬에서는 보통 Immutable 한 객체를 해시 가능한 객체라고 한다. 정리하자면, Counter는 해시 가능한 객체(Immutable 한 객체)를 세어주는 딕셔너리의 서브 클래스이다.
2.2 Counter 사용법
위에서 설명한 것처럼 Counter는 해시가능한 객체 요소가 딕셔너리 키로 저장되고 개수가 딕셔너리의 값으로 저장된다. 여기서 개수는 0이나 음수를 포함하는 임의의 정숫값이 될 수 있다.
여기서 딕셔너리와 다른점은 Counter에 존재하지 않는 객체에 대해 오류 대신 0을 반환한다는 점이다.
2.2 Counter additional methods
가. elements()
요소의 개수만큼 반복되는 순환자료형을 반환한다. 여기서 주의할 점은 Collector 역시 Dict과 마찬가지로 순서가 존재하지 않기 때문에 처음 발견되는 순서대로 반환한다.
나. most_common([n])
가장 갯수가 많은 것부터 적은 것 순으로 n개 나열한 리스트를 반환한다. (정렬의 기능)
다. subtract([iterable-or-mapping])
순환 자료형이나 다른 매핑 자료형으로부터 현재 카운터의 개수만큼 밴 후 카운터 객체를 반환한다. 여기서 0이나 음수를 반환할 수 있다.
2.3 Counter의 추가적인 패턴
내가 Counter를 보고 충격을 받았던 점은 위에 메서드뿐만아닌 추가적인 연산이 가능하다는 점이었다. 기본적으로 카운터 객체를 리스트나, 셋, 리스트로 변환이 가능하고 '+, -, &, |'와 비교 연산자도 사용이 가능하다.
'+' : 두개의 카운터의 있는 요소들의 개수를 합친다.(같은 요소라면 값만 합쳐진다)
'-' : 두개의 카운터의 있는 요소들의 개수를 뺀다. (양수의 결괏값만 나온다)
'&' : a와 b의 공통 요소의 최소갯수를 반환한다.
'|' : a와 b의 공통요소 중 최대 개수를 반환한다
딕셔너리를 활용할 때 구현하기 불편했던 점을, Counter를 통해 어느 정도 해소할 수 있겠다는 느낌을 많이 받았다. Counter를 보면서 프로그래머스를 풀 때 어렵게 구현했던 문제들을 Counter를 잘 활용한다면 쉽게 풀어낼 수 있을 것 같다는 생각이 들었다. 알고리즘 문제를 풀면서 문자열을 Key / Value값으로 구분해야 할 때 Counter를 활용하면서 연습해 보면 좋을 것 같다.
자료출처 : https://docs.python.org/3/library/collections.html#collections.Counter
'개발' 카테고리의 다른 글
[Python] heaqp 라이브러리를 이용한 우선순위 큐 (0) | 2022.06.02 |
---|---|
[SSAFY] 1학기 최종 프로젝트 : 영화 추천 사이트 (0) | 2022.05.28 |
[Python] re 라이브러리를 이용한 정규표현식 (0) | 2022.05.07 |
[Programmers] 2021 KAKAO BLIND RECRUITMENT : 합승 택시 요금 :Python (0) | 2022.05.06 |
[PROGRAMMERS] 월간 코드 챌린지 시즌 1 : 쿼드압축 후 개수 세기 Python (0) | 2022.05.02 |