파이썬 초보입니다. 도와주세요!! ( 문자열 > 리스트 > 딕셔너리 > 문자열 순으로 변환하기)

조회수 3092회

문자열(텍스트 파일)에 특정 단어가 몇 번 나오는 지 알아보고, 빈도 수에 따라 항목을 내림차순으로 정리하는 프로그램을 만들기 위해 다음과 같이 코드를 작성하였습니다. 예컨대 fairy_tale.txt 라는 텍스트 파일에

A long time ago, \n there lived a beautiful princes.

라는 문장이 들어있는데 이것을 리스트 형식으로 변환하고자 합니다.

제가 원하는 바는

첫째, 이 텍스트 파일을 ['A', 'long', 'time' 'ago' ',' 'there', 'lived', 'a', 'beautiful', 'princess'] 라는 리스트로 변환 시킨다.

둘째, 빈도 수를 세서 {'A':1, 'long':1, 'time':1 'ago':1 ',':1, 'there':1, 'lived':1, 'a':1, 'beautiful':1, 'princess':1} 의 딕셔너리로 정리한다.

셋째, 딕셔너리로 정리한 값을 순서쌍 형태의 리스트로 변환하여 정리한다.

인데 첫 번째 부분에서 어디가 잘못 작성된 것인지 모르겠습니다. 아래와 같이 코드를 실행하면 리스트가

[(1, 'A'), (1, 'long'), (1, 'time'), (1, 'ago,')] [(1, 'there'), (1, 'lived'), (1, 'a'), (1, 'beautiful'), (1, 'princes.')]

이런 식으로 생성되네요. 왜 한 개의 리스트 안에 모든 내용이 들어가지 않는것이죠? strip을 사용하여 공백도 제거하였는데... 아래에 등장하는 코드는 제가 작성한 코드입니다.

story = open('fairy_tale.txt')

for line in story:

line = line.strip()    
words = line.split()

counts = dict()
for word in words:
    counts[word] = counts.get(word,0) + 1

tmp = [(v , k) for (k),(v) in counts.items()]
print(tmp)
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 리스트가 두개로 나오는 이유는 story가 두줄이라서 for line in story 에 의해 두번 반복하게 됩니다.

    두번반복이니 두번 리스트가 출력되는 겁니다.

    질문자가 작성한 코드를 최대한 유지한채 수정합니다.

    단어수를 세는 부분은 반복을 하지 않아야 하니 단어들만 추출하는 로직을 분리합니다.

    story = open('fairy_tale.txt')
    words = (word for line in story for word in line.split())    # 토큰(단어) 추출
    
    counts = dict()
    for word in words:
        counts[word] = counts.get(word,0) + 1
    
    tmp = [(v , k) for (k),(v) in counts.items()]
    print(tmp)
    
    • 감사합니다ㅠㅠ 제가 원래 작성한 부분을 크게 수정하지 않고 답변해 주셔서 이해가 빨리 됐어요!! 알 수 없는 사용자 2018.5.23 15:57

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)