Counter는 dict의 서브클래스이다. 요소의 개수를 세어준다.
key(요소)와 value(개수) 형태로 저장된다.
객체 간 연산이 가능하다.
예시)
import collections
s1 = collections.Counter(['a','a','b','c','d'])
s2 = collections.Counter('aabcd')
# s1 = Counter({'a': 2, 'b': 1, 'c': 1, 'd': 1})
# s2 = Counter({'a': 2, 'b': 1, 'c': 1, 'd': 1})
s3 = collections.Counter({'a': 2, 'b': 1, 'c': 1, 'd': 1})
# dict객체를 넣으면 그대로
s4 = collections.Counter(a=2,b=1,c=1,d=1)
# 이런식으로도 가능
요소 찾기
dictionary와 방법이 같음
s1 = collections.Counter(['a','a','b','c','d'])
# s1 = Counter({'a': 2, 'b': 1, 'c': 1, 'd': 1})
s1['a'] # 2 있으면 value를 return
s1['e'] # 0 없으면 0을 return
사칙연산
+ : 합집합
- : 차집합
& : 교집합에서 min value
| : 교집합에서 max value
most_common 함수
가장 많이 나오는 요소들을 반환. 인풋으로 주는 숫자는 원하는 요소의 개수.
c = collections.Counter('abracadabra')
# c = Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
c.most_common(3)
# [('a', 5), ('b', 2), ('r', 2)]
문제)
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
입출력 예)
participant | completion | return |
["leo", "kiki", "eden"] | ["eden", "kiki"] | "leo" |
내가 짠 코드)
def solution(participant, completion):
d = dict()
for runner in participant:
d[runner] = d.get(runner, 0) + 1
for runner in completion:
d[runner] -= 1
if d[runner] == 0:
del d[runner]
answer = list(d.keys()).pop()
return answer
dict의 get() method를 활용
출력하고자 하는 key 있으면 해당하는 value를 없으면 오류가 아닌 None을 return한다.
d[찾을key] = d.get(찾을key, 없는 경우 return할 값) -> 요렇게 하면 원하는 key와 value의 dictionary를 바로바로 만들수 있다.
Counter 객체를 사용한 코드)
import collections
def solution(participant, completion):
answer = collections.Counter(participant) - collections.Counter(completion)
return list(answer.keys())[0]
완주하지 못한 인원이 한명이므로 Counter 객체 간에는 차집합 연산이 가능한 것을 이용하였다...
참고로 Counter 객체를 포함하는 모듈인 collections에는 ....
namedtuple() | 이름 붙은 필드를 갖는 튜플 서브 클래스를 만들기 위한 팩토리 함수 |
deque | 양쪽 끝에서 빠르게 추가와 삭제를 할 수 있는 리스트류 컨테이너 |
ChainMap | 여러 매핑의 단일 뷰를 만드는 딕셔너리류 클래스 |
Counter | 해시 가능한 객체를 세는 데 사용하는 딕셔너리 서브 클래스 |
OrderedDict | 항목이 추가된 순서를 기억하는 딕셔너리 서브 클래스 |
defaultdict | 누락된 값을 제공하기 위해 팩토리 함수를 호출하는 딕셔너리 서브 클래스 |
UserDict | 더 쉬운 딕셔너리 서브 클래싱을 위해 딕셔너리 객체를 감싸는 래퍼 |
UserList | 더 쉬운 리스트 서브 클래싱을 위해 리스트 객체를 감싸는 래퍼 |
UserString | 더 쉬운 문자열 서브 클래싱을 위해 문자열 객체를 감싸는 래퍼 |
다 공부해야 할까..?
'코딩테스트 with Python' 카테고리의 다른 글
다중 집합 (0) | 2022.01.21 |
---|---|
[파이썬] 빈 리스트 확인 하는법 (0) | 2022.01.06 |
[파이썬] itertools ,순열, 조합 등 (0) | 2022.01.01 |
[파이썬] 문자열 method replace() (0) | 2021.12.28 |
[파이썬] 내장 함수 zip (0) | 2021.12.28 |