본문 바로가기

그 땐 Algorithm했지/그 땐 Python했지

[TAVE/파이썬 알고리즘] Ch6 | 문자열 조작 - 4번 가장 흔한 단어

728x90

리스트 컴프리헨션, 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개의 데이터를 얻을 수도 있습니다.

728x90