리스트 컴프리헨션, Counter 객체 사용
1️⃣ Data Cleansing
📌입력값에 대한 전처리 작업
👉🏻대소문자가 섞이고 쉼표 등 구두점 등을 처리해준다.
words = [word for word in re.sub(r'[^\w]', ' ', paragraph)
.lower().split()
if word not in banned]
✍🏻정규식 문법
- \w 단어 문자
- ^ not
👉🏻단어 문자가 아닌 모든 문자를 공백으로 치환하는 역할을 한다.
👉🏻다음으로 소문자로 바꿔주고 공백으로 나눠준다.
👉🏻마지막으로 if문을 써주어 금지 단어를 제외한 단어들을 리스트로 저장한다.
2️⃣ 흔한 단어 추출
counts = collection.defaltdict(int)
for word in words:
counts[word] += 1
return max(counts, key=counts.get)
📌collection모듈의 defaltdict를 사용해 counts 딕셔너리를 만들고 이 속에 각 단어의 빈도수를 담아서 가장 큰 값을 return한다.
👉🏻int 기본값이 자동으로 부여되게 한다.
👉🏻딕셔너리에서 가장 큰 값을 가져오는 것은 수학의 argmax와 동일하다. 하지만 코딩테스트에서는 외부 라이브러리를 사용할 수 없어 max함수에 key를 지정해 argmax를 간접적으로 추출한다.
✅defaltdict 클래스
👉🏻일반 딕셔너리의 경우, 미리 삽입하지 않은 key를 호출하면 에러가 난다. 그러나 파이썬에서 제공하는 Dictionary는 키/값이 존재하지 않는 경우에 대한 처리를 해야 하는 경우가 많다. 그럴 경우에 기본 값을 설정이 필요한데, 특정 키에 대해서 값이 없는 경우 다음과 같이 key에 값을 기본값을 지정할 수 있다.
👉🏻이러한 특성때문에 키의 개수를 세야하는 상황이나, 리스트나 셋의 항목을 정리해야 하는 상황에 사용하는 것이 적절한다.
✅max 함수
👉🏻max 함수를 활용할 때 key 값을 지정할 수 있다. 'key=function' 형태로 넣어주면 이 key값을 기준으로 최대값을 찾는다.
nums = [-10, -5, 0, 3, 5]
max(nums) #5
max(nums, key=abs) #-10
👉🏻예를 들어 절댓값을 찾는 함수인 abs를 key값으로 넣어주면 결과가 위와 같다.
>>> counts = {"a": 10, "b": 5, "c": 20, "d": 15}
>>> max(counts)
'd'
>>> max(counts, key=counts.get)
'c'
✍🏻그럼 이 문제에서는 key값은 왜 counts.get을 사용했을까?
👉🏻딕셔너리를 max함수에 그냥 넣어주면 키값끼리 값을 비교한다. 따라서 위의 코드에서도 사전상으로 가장 큰 값인 'd'가 추출되었다.
👉🏻counts.get을 이용해 키에 해당하는 값들을 추출해 값끼리 비교해주어야 우리가 원하는 답을 얻을 수 있다.
3️⃣ 코드 간결화
counts = collections.Counter(words)
return counts.most_common(1)[0][0]
📌collection모듈의 Counter를 사용해 각 문자당 개수를 세고 most_common 메소드를 사용해 가장 흔한 단어를 추출한다.
👉🏻most_common(1)로 추출하면 [('ball' , 2)]가 리턴된다. 우리가 필요한 값은 문자열인 'ball'이므로 인덱스를 2번 사용해 값을 추출한다.
✅Counter 클래스
def countLetters(word):
counter = {}
for letter in word:
if letter not in counter:
counter[letter] = 0
counter[letter] += 1
return counter
countLetters('hello world')
# {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}
👉🏻Counter를 사용하지 않았을 때는 for문을 돌리며 해당 문자가 몇 개인지 딕셔너리에 저장한다.
from collections import Counter
Counter('hello world')
# Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
👉🏻Counter를 사용하면 코드를 간결화할 수 있다.
from collections import Counter
Counter('hello world').most_common(1)
# [('l', 3)]
👉🏻Counter를 사용하면 most_common메소드를 사용할 수 있다.
✍🏻most_common의 인자로 숫자 i를 넘기면 그 숫자 만큼만 리턴한다. 때문에 가장 개수가 많은 i개의 데이터를 얻을 수도 있습니다.
'그 땐 Algorithm했지 > 그 땐 Python했지' 카테고리의 다른 글
[TAVE/파이썬 알고리즘] Ch9 | 스택, 큐 - 24번 스택을 이용한 큐 구현 (0) | 2022.03.13 |
---|---|
[TAVE/파이썬 알고리즘] Ch10 | 데크, 우선순위 큐 - 개념 정리 (0) | 2022.03.08 |
[TAVE/파이썬 알고리즘 인터뷰] Ch12 | 그래프 - 개념 정리 (0) | 2022.03.04 |
[TAVE/파이썬 알고리즘] Ch8 | 연결 리스트 - 13번 팰린드롬 연결 리스트(leetcode 234) (0) | 2022.02.23 |
[TAVE/파이썬 알고리즘] Ch7 | 배열 - 11번 자신을 제외한 배열의 곱 (0) | 2022.01.14 |