가장 흔한 단어
by Cori문제
금지된 단어를 제외한 가장 흔하게 등장하는 단어를 출력하라. 대소문자 구분을 하지 않으며, 구두점(마침표, 쉼표 등) 또한 무시한다.
· 입출력 예
paragraph | "Bob hit a ball, the hit BALL flew far after it was hit." |
banned | ["hit"] |
return | "ball" |
풀이
1. 리스트 컴프리헨션, Counter 객체 사용
def mostCommonWord(paragraph: str, banned: list[str]) -> str:
words = [word for word in re.sub(r'[^\w]',' ', paragraph).lower().split() \
if word not in banned]
counts = collections.Counter(words)
return counts.most_common(1)[0][0]
입력값에는 대소문자가 섞여 있으며 쉼표 등 구두점이 존재하기 때문에, 정규식을 사용하여 단어 문자(\w)가 아닌 모든 문자를 공백으로 치환한다. (^ = not) 또한, not in 연산자를 통해 금지어에 포함되어 있지 않은 단어들을 대상으로 리스트를 만든다. 개수를 처리하는 부분은Counter 모듈을 사용하여 처리하였는데, Counter의 most_common(1)을 사용하여 가장 흔하게 등장하는 단어의 첫 번째 값을 추출할 경우[('ball', 2)]와 같은 형태로 추출된다. 따라서, 단어를 반환하기 위해 counts.most_common(1)[0][0]과 같은 형태로 작성한다.
* counts = collections.Counter(words) 이후 부분은 다음과 같이 작성할 수 있다.
counts = collctions.defaultdict(int)
for word in words:
counts[word] += 1
return max(counts, key=counts.get)
defaultdict를 통해 int 값이 자동으로 부여되게 하였고, 이로써 키 존재 유무를 확인할 필요 없이 couts[word] += 1을 수행할 수 있다. max 함수에 key를 지정해 주어 counts에서 값이 가장 큰 키를 가져온다.
Info
1. collections.defaultdict(int)
-> 딕셔너리에 int 값이 자동으로 부여되게 할 수 있으며, 키 값이 없어도 오류가 발생하지 않는다.
2. Counter 변수.most_common(1)
-> Counter 객체의 most_common(n)을 통해 최빈값 n개를 가져올 수 있다.
3. not in 연산자를 통해 금지어를 쉽게 피할 수 있다.
4. 정규식에서 \w는 단어 문자를 뜻하며, ^는 not을 의미한다.
블로그의 정보
코딩하는 오리
Cori