2017-05-06 9 views
-1

그래서 나는 다음과 같은 코드가 있습니다 : 그것은에있는 파일을 읽고파이썬 쌍은 목록에서 단어의 여러 사본을

def stripNonAlphaNum(text): 
    import re 
    return re.compile(r'\W+', re.UNICODE).split(text) 

def readText(fileStub): 
    words = open(fileStub, 'r').read() 
    words = words.lower() # Make it lowercase 
    wordlist = sorted(stripNonAlphaNum(words)) 
    wordfreq = [] 
    for w in wordlist: # Increase count of one upon every iteration of the word. 
    wordfreq.append(wordlist.count(w)) 
    return list(zip(wordlist, wordfreq)) 

를, 다음이 발생하는 단어 및 주파수 쌍을 만든다. 내가 직면 한 문제는 결과를 인쇄 할 때 적절한 쌍 수를 얻지 못한다는 것입니다. '(, (, 27'와 '), (27'및 ')

를 ('및 ', 27) : 나는 몇 가지 입력이 주어진 경우

,이 같은 결과를 얻을 수 있습니다 (27 번)

내가 원했던 것은 아니지만 ('와', 27), ('과', 27), ('와', 27) 해야 할 것.

오히려 나는과 같이 단어의 한 출력과 하나의 번호를주고 그것을 좋아하는 것 :

('및', 27), ('수', 5), ('박쥐'를, 6) .. etc

어떻게 해결할 수 있습니까?

답변

1

사전 사용을 고려해야합니다. 사전은 해시 맵처럼 작동하므로 연관 색인이 가능합니다. 이런 식으로 중복은 문제가되지 않습니다.

... 
    wordfreq = {} 
    for w in wordlist: 
    wordfreq[w] = wordlist.count(w) 
    return wordfreq 

당신이 정말로 목록을 반환해야하는 경우, 단지 return wordfreq.items()

을이 방법의 유일한 문제는 당신이 불필요하게 한 번 각 단어에 대한보다 wordlist.count() 메소드는 더 계산하는 것입니다. 이 문제를 방지하려면 for w in set(wordlist):

추가 질문 편집 : 목록을 반환해도 괜찮 으면 return sorted(wordfreq.items(), key=lambda t: t[1])을 작성하십시오. 키 부분을 생략하면 결과가 단어 첫 번째로 정렬되고 그 다음 값

+0

이 순서대로 정렬됩니다. 할 수 있으면 편집 하나, 항목 수와 알파벳 순서에 따라 사전에 항목을 정렬하려면 어떻게해야합니까? 그래서 '1'을 값으로하는 모든 것에 대해, 알파벳 순으로 정렬해야합니다. – Annabelle

+0

답변을 편집하여 필요에 맞게 바란다. – PMonti