2016-12-09 2 views
2

Ich nehme eine Textdatei als Eingabe und erstelle eine Funktion, die zählt, welches Wort am häufigsten vorkommt. Wenn zwei oder mehr Wörter am häufigsten vorkommen und gleich sind, drucke ich alle diese Wörter.TypeError: nicht hashbarer Typ: 'list' - Erstellen einer Häufigkeitsfunktion

def wordOccurance(userFile): 

    userFile.seek(0) 
    line = userFile.readline() 
    lines = [] 
    while line != "": 
     if line != "\n": 
      line = line.lower() # making lower case 
      line = line.rstrip("\n") # cleaning 
      line = line.rstrip("?") #cleans the whole docoument by removing "?" 
      line = line.rstrip("!") #cleans the whole docoument by removing "!" 
      line = line.rstrip(".") #cleans the whole docoument by removing "." 
      line = line.split(" ") #splits the texts into space 
      lines.append(line) 
     line = userFile.readline() # keep reading lines from document. 

    words = lines 

    wordDict = {} #creates the clean word Dic, from above 
    for word in words: # 
     if word in wordDict.keys(): 
      wordDict[word] = wordDict[word] + 1 
     else: 
      wordDict[word] = 1 

    largest_value = max(wordDict.values()) 

    for k in wordDict.keys(): 
     if wordDict[k] == largest_value: 
      print(k) 

    return wordDict 

Bitte helfen Sie mir bei dieser Funktion.

+0

Welche Zeile löst den Fehler aus? Irgendwann (vielleicht bei "wordDict [word] = 1") versuchen Sie eine Liste als Wörterbuchschlüssel zu verwenden, was nicht erlaubt ist. – elethan

+0

Diese Zeile gibt mir die Fehlermeldung: Wenn Wort in WordDict.keys(): –

+0

Ich kann nicht auf irgendeine Weise denken, dass Sie diesen Fehler von dieser Zeile erhalten könnten. Funktioniert die Lösung, die ich gepostet habe, für dich? Wenn nicht, könnten Sie bitte den vollständigen Traceback von Ihrem Fehler in Ihrer Frage veröffentlichen, damit ich Ihnen besser helfen kann? – elethan

Antwort

0

In dieser Zeile Sie eine Liste von Strings erstellen:

line = line.split(" ") #splits the texts into space 

Dann Sie es auf eine Liste anhängen, so dass Sie eine Liste der Listen haben:

lines.append(line) 

Später Sie Schleife durch die Liste von Listen, und versuchen, eine Unterliste als Schlüssel zu verwenden:

for word in words: # 
    if word in wordDict.keys(): 
     wordDict[word] = wordDict[word] + 1 
    else: 
     wordDict[word] = 1 # Here you will try to assign a list (`word`) as a key, which is not allowed 

eine einfache Lösung, die Liste der lis zu abzuflachen wäre erste TS-:

words = [item for sublist in lines for item in sublist] 

for word in words: # 
    if word in wordDict.keys(): 
     wordDict[word] = wordDict[word] + 1 
    else: 
     wordDict[word] = 1 

Die list comprehension[item for sublist in lines for item in sublist] Willen Schleife durch lines, dann eine Schleife durch die Unterlisten von line.split(" ") erstellt und eine neue Liste kehren die Elemente in jeder Unterliste besteht. Für Sie sieht lines wahrscheinlich so etwas wie folgt aus:

[['words', 'on', 'line', 'one'], ['words', 'on', 'line', 'two']] 

Die Liste Verständnis wird es in diese abbiegen:

['words', 'on', 'line', 'one', 'words', 'on', 'line', 'two'] 

Wenn Sie etwas weniger kompliziert verwenden möchten, können Sie einfach geschachtelt verwenden Schleifen:

# words = lines 
    # just use `lines` in your for loop instead of creating an identical list 

    wordDict = {} #creates the clean word Dic, from above 
    for line in lines: 
     for word in line: 
      if word in wordDict.keys(): 
       wordDict[word] = wordDict[word] + 1 
      else: 
       wordDict[word] = 1 

    largest_value = max(wordDict.values()) 

Dies wird wahrscheinlich ein wenig weniger effizient und/oder „Pythonic“ sein, aber es wird wahrscheinlich einfacher sein, den Kopf herum zu wickeln. Wenn Sie die Zeilen zuerst bereinigen, werden Sie die Interpunktion nur am Zeilenende und nicht am Ende der Wörter entfernen. Sie können auch in Erwägung ziehen, jede Zeile in Wörter aufzuteilen, bevor Sie die Daten bereinigen. Dies ist jedoch abhängig von der Art Ihrer Daten möglicherweise nicht erforderlich.

Verwandte Themen