2024.07.05 - [Upstage AI Lab 4기 학습일지] - 7/5 학습일지 | 파이썬 | 반복문 연습
7/5 학습일지 | 파이썬 | 반복문 연습
연습문제다음과 같은 영어기사 5개가 있다. 뉴스 기사에 등장하는 모든 단어마다 개수를 세어보자!계속 막혀서 다른 함수써서 야매(?)로 얻은 답.. from collections import Counternews1 = "hello it, it's me. I
working-with-science.tistory.com
이때 했던 문제랑 거의 비슷한 문제가 다시 나왔다! 근데 왜 다시 풀려니까 안풀리는건지!!!

오늘은 조건문, 반복문을 배웠고 사전강의에서 봤던 강사님이 이번 주 내내 줌으로 강의해주시는 거라 엄청 익숙했다. 사전강의에서 한 번씩 풀어봤던 듯한 문제들도 나와서 금방 할 수 있을거라 생각했는데 착각ㅋㅋㅋㅋㅋㅋ
파이썬 언어를 공부할 때에는 문법이 먼저 익숙해져야하고, 그 다음에 결과가 어떻게 나오는지를 알아야 하고, 마지막에 로직에 익숙해진다고 한다. 특히 반복문에서는 "반복할 대상"이 명확해야 한다. 무엇을 반복시킬지 정한 뒤에 로직을 짜자.
문제
* 다음 문서에 등장하는 단어마다 등장 횟수를 세어보자!
pep8 = """This document gives coding conventions for the Python code comprising the standard library in the main Python distribution. Please see the companion informational PEP describing style guidelines for the C code in the C implementation of Python.This document and PEP 257 (Docstring Conventions) were adapted from Guido’s original Python Style Guide essay, with some additions from Barry’s style guide [2].This style guide evolves over time as additional conventions are identified and past conventions are rendered obsolete by changes in the language itself.Many projects have their own coding style guidelines. In the event of any conflicts, such project-specific guides take precedence for that project."""
처음에 내가 떠올렸던 방법은 이런 것이였다.
1. 리스트 두 개를 만든다. (단어가 들어있는 리스트와 각 단어의 횟수가 들어간 리스트)
2. 겹치는 단어가 없도록 만든다.
3. for문을 돌면서 첫 번째 단어와 다음 단어를 비교해서 같으면 횟수에 +1을 한다.
4. 최종 단어와 횟수를 프린트한다.
이 방법으로 어찌어찌 만들어보긴 했는데 (굉장히 비효율적이라는 챗지피티의 평가를 받았다.) 거지같지만 발전 과정을 보기 위해 굳이 기록으로 남기자면,
1) word_list라는 리스트를 만들어서 pep8 문서의 단어들을 쪼갰다.
2) number는 여기서 단어가 몇 번 나왔는지를 저장할 숫자 리스트로 정의했고, 초기값은 0으로 두고 word_list의 길이(단어의 개수)만큼 0을 만들었다. (1:1 대응을 시키려고)
3) word_list 안에 들어 있는 단어에 인덱싱을 해서 각 단어가 다음 단어랑 같으면 같은 인덱싱이 된 number 값에 1을 더한다.
4) word_list와 number를 1:1 대응시켜 딕셔너리로 만든다.
word_list = pep8.split()
number=[]
for i in range(len(word_list)):
number.append(0)
for j in range(0, len(word_list)): # 0부터 104번째까지 돌기
for next in range(j+1):
if word_list[j] == word_list[next] :
number[j] = number[j] + 1
combined = dict(zip(L, number))
for word in sorted(combined):
print(f"{word} : {combined[word]}")
+ 업그레이드 버전
인덱싱을 해서 굳이 n번째 단어와 n+1번째 단어를 비교해가면서 횟수를 셀 필요가 없다!! ⭐︎⭐︎⭐︎
1) word_list 안에 단어들을 쪼개서 담는 건 똑같다.
2) word_vs_count라는 딕셔너리를 만든다. (key : value = word : count)
3) word_list에 있는 단어들을 하나씩 꺼내서 딕셔너리에 넣는다. 단어의 횟수(count)는 word_vs_count[i]로 표기되는데, 여기서 i가 딕셔너리의 key로 들어가기 때문에 word_vs_count[i]는 그에 해당하는 value가 된다. 즉 This를 넣었을 때 word_list 안에서 중복된 값이 있을 때 count 값에 1을 더한다. 중복된 값이 없다면 그냥 count는 1.
4) 프린트한다.
word_list = pep8.split()
word_vs_count = {}
for i in word_list:
if i in word_vs_count :
word_vs_count[i] += 1
else:
word_vs_count[i] = 1
for word in sorted(word_vs_count):
print(f"{word} : {word_vs_count[word]}")
이건 강사쌤도 알려준 방법이였는데, i 대신 word라고 변수명을 다르게 썼을 뿐 구조는 똑같다.
word_Dict = {} # key : value = word : count
for word in word_list:
if word in word_Dict: # 이미 해당 단어가 word_Dict에 key로 있는 경우.
word_Dict[word] = word_Dict[word] + 1
else: # 해당 단어를 처음보는 경우(=word_Dict에 key로 없는 경우)
word_Dict[word] = 1
for word in sorted(word_Dict.keys()):
print(f"{word} : {word_Dict[word]}")
+ 가장 쉬운 방법!
1) 중복되는 단어를 없애기 위해 word_list를 set(집합)으로 만든다 -> 이 안에서 word 출력
2) word의 횟수에 대한 값은 .count 라는 함수를 써서 출력한다.
word_list = pep8.split()
word_set = set(word_list) # 단어 종류.
for word in sorted(word_set):
print(f"{word} : {word_list.count(word)}")
+ 외부 라이브러리를 사용할 수 있다면?
카운터 함수를 쓰면 빈도를 자동으로 계산해준다.
1) word_list 안에 단어들의 출현 빈도를 count 함수로 세어서 word_Dict에 key:value로 저장해준다. 그러니까 자동으로 word_Dict 안에는 'this : 3' 이런 식으로 저장된다. key값은 여전히 word.
2) word와 count( word_Dict.keys() = value ) 를 출력한다.
from collections import Counter
word_Dict = Counter(word_list) # dict 같은 key:value가 word:count인 구조를 만들어주는 함수.
for word in sorted(word_Dict.keys()):
print(f"{word} : {word_Dict[word]}")
'공부방 > Upstage AI Lab 4기' 카테고리의 다른 글
7/30 학습일지 | 파이썬 함수 쓸 때 꼭 살펴볼 것 (0) | 2024.07.31 |
---|---|
파이썬 출력문 역슬래시 사용법 (0) | 2024.07.30 |
리눅스에 익숙해지기 (0) | 2024.07.26 |
부트캠프 현직자, 수료생 특강 (0) | 2024.07.26 |
7/25 학습일지 | 시스템 프로그래밍 대충 큰크림과 개념 정리 (0) | 2024.07.25 |