선생님들.. 파이썬 2문제만 질문드리옵니다 ㅠㅠ
- Might
- 조회 수 2932
- 2021.09.26. 00:21
문제와 제가 작성한 코드입미다.. 독학으로 찔끔씩 하고 있는데 당장 풀어야할 과제라서
여태껏 배운 내용들 뒤져보며 복습해도 도저히 답이 안 나와서 질문드립니다 ㅜㅜ
각 요소들을 하나씩 함수로 만드는 과정은 과거에 배웠는데
저렇게 많은 요소들을 하나의 함수에 담으려니 뇌가 한계에 달했네요.. ㅜㅜ
이 두 문제로 3시간 넘게 머리 싸매다 도저히 효율적인 방법이 아닌 것 같아
질문 드리고 그 답을 통해 학습해보고자 합니다.. 도와주십쇼 ㅠㅠ
선생님, 정성스러운 댓글 정말 감사드립니다. 사실 프로그래밍을 공부한다기보다는 아직은 과정 수료와 그를 위한 과제 풀이만으로도 너무 급급한 수준이라.. 사실 아주 기본적인 개념 설명과 그 예제 풀이 외에 저런 식으로 코드 짜는 것은 도저히 손이 가지를 않습니다.. ㅠㅠ 말씀 주신 부분을 참고해서 1번 문제를 조금 수정해보았는데.. 도저히 잘 모르겠네요 ㅠㅠ 정말 염치 없지만.. 혹시 여유가 되신다면 예제 코드 한번 짜주실 수도 있으실까요?..
def filter_by_text(text) :
# 주어진 규칙에 맞추어 filter_by_text()함수를 구현해주세요.
# corpus.txt에 있는 텍스트를 읽어와서 corpus라는 리스트에 추가한다.
corpus = []
with open('corpus.txt') as file:
for corpus in file
# corpus에 있는 데이터 중, text로 시작하는 단어만을 추려서 result라는 리스트에 저장한다.
result = []
for result in corpus if word.startswith(text)
# 찾은 영어 단어를 빈도수를 기준으로 내림차순으로 정렬하여 20개만 출력한다.
return sorted(corpus, key=itemgetter(1), reverse=True)[:20]
# 아래 부분은 수정하지 마세요!
# 입력과 출력을 수행하는 코드입니다.
t = input()
filter_by_text(t)
이런 에러가 출력이 됩니다 ㅠㅠ
2번의 경우
def trump_tweet(text) :
# 주어진 규칙에 맞추어 trump_twit()함수를 구현해주세요.
# pass는 지우고 코드를 작성해주세요.
words = text.split()
Hashtag, Mention, Others = [],[],[]
for word in words:
if word.startswith('#'):
plain_word=word[1:]
Hashtag.append(plain_word)
elif word.startswith('@'):
plain_word=word[1:]
Mention.append(plain_word)
else :
Others.append(word)
return Hashtag, Mention, Others
print(trump_tweet(text))
이렇게 print를 추가하였는데, 코드를 실행하면
Traceback (most recent call last): File "main.py", line 18, in <module> print(trump_tweet(text)) NameError: name 'text' is not defined
이런 에러가 출력이 됩니다.. ㅠㅠ 저녁 먹고 이것만 붙잡고 있는데 진도가 1도 안 나가니 너무 답답하고
수료조차 못할까봐 공포스러운 마음마저 듭니다.. 살기 위해서는 꼭 해야하는데 ㅠㅠ
살려주십쇼.. ㅠㅠ
def filter_by_text(text) :
# 주어진 규칙에 맞추어 filter_by_text()함수를 구현해주세요.
# corpus.txt에 있는 텍스트를 읽어와서 corpus라는 리스트에 추가한다.
corpus = []
with open(text) as file:
for corpus2 in file:
corpus.append(corpus2)
# corpus에 있는 데이터 중, text로 시작하는 단어만을 추려서 result라는 리스트에 저장한다.
result = []
for result in corpus if word.startswith(text)
# 찾은 영어 단어를 빈도수를 기준으로 내림차순으로 정렬하여 20개만 출력한다.
return sorted(corpus, key=itemgetter(1), reverse=True)[:20]
# 아래 부분은 수정하지 마세요!
# 입력과 출력을 수행하는 코드입니다.
t = input()
filter_by_text(t)
이렇게 수정한 상태인데,
File "main.py", line 12 for result in corpus if word.startswith(text) ^ SyntaxError: invalid syntax
이렇게 오류가 출력이 됩니다 ㅜㅜ 파이썬이란 걸 하나도 모르다가 정말 기본적인 강의 내용을 3달에 걸쳐 겨우겨우 듣다 보니 사실 보는 건 이해가 되는데 혼자 코딩을 만들어내는 능력이 전무한 수준입니다 흑흑..
정말 친절하게 잘 알려주시는데도 어렵네요.. itemgetter는 저도 사실 뭔지 잘 모르겠습니다. 이전 강의에서 유사한 기능을 한 부분을 옮겨 온 코드인데.. 저건 상관 없이 지시 사항에 맞는 코드로 바꿔주면 될 것 같습니다 ㅠㅠ
for result in corpus if word.startswith(text)
이부분을
for result in corpus:
if word.startswith(text)
이렇게 수정해야되겠네요.
에러 뜨면 그대로 긁어서 구글링해보면 설명이 많이 나옵니다.
key=itemgetter(1)은 iterator로 이루어진 list를 sort할 때 특정 원소를 가져오기 위해서 쓰는 함수입니다.
itemgetter(1)이면 iterator의 index값이 1인 원소를 가져와서 sort할떄 사용한다고만 알아두시면 될 거 같아요. 자세한 건 파이썬 함수 paramerter에 대한 배경지식이 필요해서..
def filter_by_text(text) :
# 주어진 규칙에 맞추어 filter_by_text()함수를 구현해주세요.
# corpus.txt에 있는 텍스트를 읽어와서 corpus라는 리스트에 추가한다.
corpus = []
with open(text) as file:
for line in file:
split = line.split(',')
word = split[0]
freq = split[1]
new_tuple = (word, freq)
corpus.append(new_tuple)
# corpus에 있는 데이터 중, text로 시작하는 단어만을 추려서 result라는 리스트에 저장한다.
result = []
result = [result for result in corpus if word.startswith(text)]
# 찾은 영어 단어를 빈도수를 기준으로 내림차순으로 정렬하여 20개만 출력한다.
return sorted(corpus, key=itemgetter(1), reverse=True)[:20]
print(filter_by_text(text))
# 아래 부분은 수정하지 마세요!
# 입력과 출력을 수행하는 코드입니다.
t = input()
filter_by_text(t)
다시 조금 수정을 해보았는데..
우선 프로그래밍 문제를 해결하시는데 앞서, 문제가 무엇인지 정의를 정확히 파악하시는 것이 중요할 것 같습니다.
문제는 문자열을 text로 받아서, 그 문자열로 시작하는 파일을 읽어오도록 하고 있습니다.
그런데 Might님이 구현하신 코드에서 text는 어느새 open에 사용되어 문자열의 빈도수를 나타내는 파일의 이름인 것처럼 사용되고 있습니다.
조급한 마음은 알겠습니다만, 조금 더 차분히 문제를 해결하시는 것이 필요하지 않을까 생각합니다ㅏ.
또한, itemgetter가 무엇인지는 여전히 코드에서 드러나있지 않네요. 이러면 컴퓨터는 이게 무엇인지 전혀 모릅니다.
넵, 맞습니다. 사실 프로그래밍을 배우고 싶다는 마음은 갖고 있었는데.. 현재 회사에서 권유이지만 사실 절대 거절할 수 없는 분위기로 입교를 강요한 상태인데다.. 이 강의가 솔직히 초보자들이 기본 개념을 탄탄하게 익히고 요 정도 수준의 문제를 풀기에도 부실한 수준이라 따로 공부를 해야 하는데.. 갑자기 전달부터 바빠지고 이번달은 단 하루 빼고 추석연휴에도 하루도 못쉬고 출근하는 일정이 겹친 데다가 월말까지 과정을 완전히 수료해야 하다 보니 지금 머리가 하얗습니다 ㅠㅠ 오늘도 이거 단 2문제로 지금까지 하루 종일 씨름했는데 풀지도 못해서.. 너무너무 정신적으로 지치고 공포에 휩싸여서 조급함만 늘어가고 있는 상태입니다. 너무 힘들어서 횡설수설을 해버렸네요.. 친절하게 가르쳐 주셔서 감사합니다 ㅜㅜ 조각조각 개념들은 어느 정도 이해를 하였는데, 근본적인 뿌리자체가 내리지 못한 상태라 선생님께서 아주 친절히 설명해주시는 부분들도 흡수가 잘 안 되고 있답니다 흑흑..
1번 관련해서 설명과 곁들여서 써드립니다.
그런데 우선은 프로그래밍 기초부터 다시 쌓으시는 게 좋지 않을까 싷습니다... 지금 이 코드를 복붙해서 통과하셔도 실력은 안 늘어서 악순환만 반복됩니다. 마지막에 마지막 순간에 봐주세요
선생님, 늦은 시간까지 정성스러운 답변 정말 감사드립니다.
요렇게 주신 대로 작성했는데.. 희한하게도 저렇게 나옵니다 ㅠㅠ
문제 의도 자체가 함수를 def filter_by_text(text) : 요거 하나만 써서 만들어라고 하는 것 같아서
그 부분 때문인지는 저도 잘 모르겠습니다.. 전혀 어떤 부분이 문제인지 감이 안 잡히는군요 ㅠㅠ
회사에서도 문과 방면 일을 하고, 파이썬은 아마 퇴사 전까지 건드릴 일도 없을 것 같은데 이렇게
과정을 수료하려고 하니.. 솔직히 너무 버겁긴 합니다. 그런데 누구한테 힘들다고 털어놓을 수도 없더라구요
ㅎㅎ.. 저만 이 과정을 듣고 있는데 동기부여도 생존 때문이라는 단 하나 외에는 없는데 이게 너무 스트레스가
크다 보니.. 이거 때문에 다 놓고 싶을 정도로 핀치에 몰려있네요 ㅠㅠ 널널한 상황에서도 꽤 압박이 될 텐데
한 달 동안 단 한 시간을 맘편히 쉬지 못한 상황에서 이러니 ㅠㅠ...
너무 늦은 시간이니 혹시 저를 불쌍히 여겨 추가 답변 해주실 부분이시라면 내일 해주셔도 괜찮습니다.
정말 감사합니다 ㅠㅠ
윗분의 답을 조금 수정했습니다. 거의 다 맞으셨는데 출력 형식을 원 글에 안적어주셔서 그 부분이 틀렸던 것 같네요.
넵 2번은 해결을 했습니다.
두 함수 모두 있어야지만 코드가 작동합니다. 제가 직접 돌려봤을때는 잘 작동하는데 뭐가 문제인지 모르겠네요. 문제의 입출력 조건에는 이제 완벽히 부합하는데..
그쪽 채점 플랫폼이 어떤 방식으로 채점을 하는지를 모르니 여기서 더 도와드릴 방법이 없는 것 같습니다. 코드에는 오류가 없어서요. 차라리 고객센터나 뭐 회사나 그쪽에 문의해보시는게 나을 것 같아요.
마지막 가능성으로 문제에서 주석으로 준 것과 같이 corpus나 result 같은 내부 변수를 체크할 수도 있긴 한데.. 그럴 리가 없거든요. 문제에 나온 채점 조건은 출력만 하면 되니까. 그리고 시간 초과 오류가 나올 코드 자체가 아닙니다 연산 수준이..
혹시 컴퓨터에 파이썬 실행 환경이 세팅되어 있습니까?(=파이썬이 깔려있나요?)
제가 올린 코드를 그대로 붙여놓은 뒤 파이썬으로 실행하면 작동이 되나요?(같은 디렉토리에 corpus.txt가 존재해야 합니다. 얘도 복붙해서 넣으시면 됩니다) input()이 들어가있으니 실행을 한 뒤 원하시는 글자를 넣고서 엔터를 누르면 (출력 포맷을 보지 못해서 제대로 안 적었지만) 실행하는 걸 보실 수 있을겁니다.
출력 포맷의 경우, 해당 학습 플랫폼마다 방법이 달라서(예를 들어, 어떤 사이트는 화면 출력 함수를 이용해서 출력하라고 요구하고, 어떤 사이트는 함수로 return하라는 식으로 언급합니다) 이에 대한 차이일 수 있습니다. 핵심 로직은 제가 구현해놓았으니 사이트에서 요구하는 사항을 먼저 확인하시는 것이 급선무일 것 같습니다. 이후 적절히 이를 포맷에 맞춘 뒤 보내주시면 됩니다.
2번 로직은 거의 비슷하게 잘 짜신 것 같아 크게 말씀드리지는 않겠습니다.
나름대로 잘 필요한 기능을 구현하고 있는 것 같습니다.
다만, 두 문제 모두 정확하게는 확인이 어렵습니다만 문제의 요구사항이 원하는 대로 자료를 취합한 뒤 이를 출력하는 것인데 출력이 되고 있는지 잘 모르겠습니다(print 등의 함수를 이용). 이 부분 확인 부탁드립니다.
1번 문제
(가장 중요) strip은 단순히 인자를 전달하지 않을 때 whitespace를 기준으로 나누는 것으로 임의로 정할 뿐입니다. strip에 string을 인자로 전달할 경우, 해당 string을 기준으로 해서 나누게 됩니다! 이를 아셨다면 문제가 훨씬 수월해졌겠죠.(지금은 힘드시지만 나중에는 공식 문서를 보시는 게 좋습니다! 공식 문서는 이 모든 경우를 모두 기술해주거든요)
ex) "꿈은☆이루어진다".split("☆") # ["꿈은", "이루어진다"]
기타
filenames는 미리 정의되어 있나요?? corpus.txt 파일만을 확인해서 여는 프로그램인데, filenames는 마치 여러개의 파일이 있어서 그들을 모두 분석하는 듯한 느낌이 드네요. 미리 있을 수도 있으니 너무 심각하게 받아들이진 말아주세요
return이 실행되면 함수는 즉시 자신이 들고 있는 모든 변수의 값등을 버리고 바로 실행을 종료합니다. 즉, 함수 안에서 첫번째 return 아래에 있는 구문은 절대 실행되지 않습니다. 아래의 구문이 의미가 있는 구문이라면 return 실행하는 것을 조심해주세요
8번 라인에서 punctuation과 symbol이 나오는데, 이로 보아서는 쉼표를 없애는 것으로 보입니다(미니기기 코리아 => 미니기기코리아). 이후에 split()이 이루어지면 이 경우에는 아무것도 분리되지 않고 하나의 문장이 그대로 list에 담겨서 나오는 것으로 기억하는데요. 이게 적절한 처리일까요?
words는 어디서 쓰이나요? 이후에 함수 내에서 어디에서도 사용되지 않습니다. 전역변수일까요? 지금은 한창 배우시는 중이라 크게 신경쓰지 않으셔도 되지만 전역변수의 변경을 줄이는 게 좋다는 것만 알아두세요!
2번은 앞서 언급한 출력이 제대로 이루어지고 있는지? 문제만 해결되면 되지 않을까 싶습니다. 더 간단하게 쓸 수 있기는 한데.. 이 시점부터 프로그래밍이 아니라 야매꼼수 배우기가 됩니다 ( ..)
프로그래밍을 시작하신 것을 Hello, world합니다 ;)