로그인회원가입마이페이지대화방IRC디스코드LAB운영자에게타입문넷 RSS  접속자 : 329 (회원 245) 오늘 27,762 어제 28,088 전체 88,838,126  
① 질문게 이용자의 기본상식 "검색의 생활화"
② 질문게는 4줄제한이 없습니다...만, 되도록이면 답변하시는 분들을 위해 질문의 내용을 좀 더 자세히 써주세요.
③ 몸이 안좋으시면 질문을 하시기전에 먼저 병원부터 가는게 좋습니다.
총 게시물 22,761건, 최근 3 건
   
[컴퓨터/인터넷]

파이썬 딕셔너리 이용한 단어 빈도 계산 질문드립니다.

글쓴이 : qpmzm232 날짜 : 2018-06-14 (목) 16:15 조회 : 396
글주소 : http://www.typemoon.net/qna/116253
f=open('c:/doit/원본.txt', 'r', encoding='utf-16')
r=open('c:/doit/어절 빈도 통계.txt', 'w', encoding='utf-16')
data=f.read()
data2=data.split()
count={}
for word in data2:
if word in count:
count[word] +=1
else:
count[word] = 1
for key in count:
r.write("%s: %d" % (key,count[key])+"\n")
print("작업완료")
r.close()


이 스크립트가 정상적으로 작동은 하는데, 그 원리를 몰라서 질문드립니다.

제가 문자열, 리스트형을 배울때 분명 'if x in y:'라고 가정하면, y라는 집합안에 x라는 미지수가 있는걸로 이해를 했습니다.
그런데 신기하게도 다섯번째 줄 'count={}'는 딕셔너리에 아무것도 없는데, 어떻게 if word in count:가 정상적으로 작동을 하는 건가요?
뭔가 딕셔너리 안에 원소가 있어야 찾을 수 있는 거 아닌가요?

1.71 Kbytes

qpmzm232 님의 질문게시판 최신글 [더보기]


스즈키의하루 2018-06-14 (목) 16:41
없는것도 정보니까요.

count = {}를 핫게되면 count 를 딕셔너리로 선언하고 그 안에는 null이 들어가있는 상태입니다.
if word in count : 에서는 처음엔 count에 null이 들어가있기 때문에 else부분으로 분기하게 되고 그 뒤에 count[word] = 1로 하여 단어가 있는걸로 체크한겁니다.
댓글주소
     
     
qpmzm232 2018-06-14 (목) 17:02
그렇군요....!!
작동은 되는데 원리를 몰라서 답답했는데 설명해주셔서 정말 감사합니다.

댓글주소
Kunggom 2018-06-15 (금) 01:37

정확히 말하자면, “if x in y:”를 우리말로 번역하면 “만약 집합 y 안에 원소 x가 있는 경우:”가 됩니다. 그리고 “else:”문은 “그렇지 않은 경우:”가 되지요. 집합 y 안에 원소 x가 있는 경우와 없는 경우를 둘 다 정의하고, 그 과정을 for문을 통해 계속 반복해나가는 것이 위 코드의 핵심입니다.


예를 들어 ["하늘", "바람", "대지", "바람"]이라는 배열이 있고, 여기에 위 코드를 적용해 본다고 생각해 봅시다. 맨 처음에는 count라는 집합 속에 아무것도 없습니다.

count = { } # 아무것도 없음.

그래서 else문 뒷쪽의 내용이 실행이 되지요. 그럼 count 집합의 내용은 다음과 같이 바뀝니다.

count = {"하늘": 1}

이제 for문에 의해 배열의 다음 원소인 "바람"에 대해 다시 위 코드가 실행됩니다. 그럼 count는 이렇게 바뀌겠지요.

count = {"하늘": 1, "바람": 1}

다음 원소인 "대지"에서도 역시 else문 뒷쪽의 내용이 실행됩니다. 왜냐하면 "대지"라는 key는 count라는 딕셔너리 속에 없으니까요.

count = {"하늘": 1, "바람": 1, "대지": 1}

그런데 마지막 원소인 "바람"은 사정이 다릅니다. 왜냐하면 count 딕셔너리에 이미 "바람"이라는 key가 있으니까요. 따라서 컴퓨터는 “if word in count:”문이 참(True)이라고 판정하고, if문 뒤의 내용을 실행합니다. 그러면 count 딕셔너리는 이렇게 바뀌죠.

count = {"하늘": 1, "바람": 2, "대지": 1}

이제 더이상 for문을 돌릴 남은 원소가 없으니, 이것이 최종 결과물이 됩니다.


프로그래밍을 공부할 때는, 이런 식으로 코드가 돌아가는 것을 한 줄 한 줄 쫓아가는 것이 아주 중요한 연습이 됩니다. 이걸 직접 손으로 하기가 버겁다면, Python Tutor 같은 웹사이트를 이용하시는 것도 좋습니다.

댓글주소
     
     
qpmzm232 2018-06-25 (월) 00:41
항상 모바일로 접속해서 댓글 달아주신걸 이제야 확인했습니다.
쉽게 설명해주시고 관심주셔서 정말 감사합니다.
댓글주소
☞특수문자
hi
   

총 게시물 22,761건, 최근 3 건
번호 제목 글쓴이 날짜 조회
22101 [일반]  동방 기연담 자창게 혹은 팬픽에 대하여 질문 드립니다 +5 스칼 06-16 247
22100 [일반]  SOS 네이버북스에서 깊은산 06-16 178
22099 [만화/애니]  풀 메탈 패닉 원작 소설을 E북으로 읽어보려고 하는데, 후기에 실린 설정화… +2 Wasp 06-15 438
22098 [컴퓨터/인터넷]  도대체 구글 번역창이 왜 뜨는걸까요? 니힐리안 06-15 240
22097 [만화/애니]  AA 번역을 하려고 하는데 조언을 구합니다. +7 성재 06-15 282
22096 [일반]  내청춘 팬픽을 찾습니다 미클리어 06-15 174
22095 [일반]  치킨스톡 질문입니다 +5 때리고보니액… 06-14 385
22094 [일반]  성인 인증 관련 질문 가능할까요 +4 루나사 06-14 291
22093 [컴퓨터/인터넷]  파이썬 딕셔너리 이용한 단어 빈도 계산 질문드립니다. +4 qpmzm232 06-14 397
22092 [일반]  문피아 소설을 찾으려고 합니다 +1 무왕 06-14 206
22091 [게임]  [FGO] 게임내 스토리 그대로 갔다는 가정 하에 칼데아에는 어떤 서번트들이 … +11 유풍 06-13 409
22090 [컴퓨터/인터넷]  군대에서 태블릿을 사려고 합니다 +7 멜론중독자 06-13 529
22089 [취미]  [FGO/네타] 문넷 창게에 연재되었던 팬픽 소설을 찾습니다. 비야키 06-13 236
22088 [게임]  폴아웃 76 스팀으로는 안나오는 건가요? +1 마력사슴Manadeer 06-13 481
22087 [만화/애니]  초 고전 한국만화 찾습니다. +2 치르코 06-13 340
22086 [게임]  멘탈 오메가 실행 질문입니다. 김기선 06-12 156
22085 [쇼핑]  순살 닭다리 정육 이거 아무 이마트 가면 있겠죠? +3 link 때리고보니액… 06-12 416
22084 [일반]  먼치킨 소설좀 추천해주세요. +5 JUVES 06-12 958
22083 [일반]  pc방 컴퓨터 책상 추천 좀 해주세요. 명석 06-12 622
22082 [일반]  장례식 복장에 관해 질문드립니다 +4 카니아드 06-12 696
처음  이전  31  32  33  34  35  36  37  38  39  40  다음  맨끝
FAQ를 애용합시다.




Powered by Sir OpenCode 마이위트 DNS Powered by DNSEver.com 통큰아이
광고·제휴문의  |  이용약관  |  개인정보취급방침  |  책임의한계와법적고지  |  이메일주소무단수집거부  |  운영자에게  |  사이트맵(XML) 

타입문넷
SINCE
2003. 12. 25
타입문넷에 게재되는 모든 컨텐츠의 저작권은 해당 저작권자에게 있습니다.
타입문넷에 등록 된 모든 게시물의 권리와 책임은 해당 게시물의 게시자에게 있으며,
게시물에 의해 발생하는 문제에 대해 타입문넷은 일체 책임지지 않습니다.

타입문넷의 로고 및 배너는 백묵서체연구소의 0020-!백묵-갈잎체(견중) 서체를 사용중입니다.



Copyright ⒞ 2007 TYPEMOON.NET All Rights Reserved.
SSL certificates