2016-12-15 6 views
-1

Ich versuche, jedes Wort aus Textdateien zu zählen und das Wort und die Anzahl an ein Wörterbuch als die Schlüssel-Wert-Paare zu zählen. Es wirft mich diesen Fehler: Wenn Schlüssel nicht in WordDict: TypeError: nicht hashbar Typ: 'Liste' Auch ich frage mich von .split() ist gut, weil meine Textdateien verschiedene Satzzeichen enthalten.Python-Inkrementwerte in einem Wörterbuch

fileref = open(mypath + '/' + i, 'r') 
wordDict = {} 
for line in fileref.readlines(): 
    key = line.split() 
    if key not in wordDict: 
     wordDict[key] = 1 
    else: 
     wordDict[key] += 1 
+0

Wenn Sie einen _additional_ seperator verwenden möchten, können Sie 'line.replace (other, '')' verwenden, bevor Sie 'split'. – MSeifert

Antwort

2
from collections import Counter 
text = '''I am trying to count every word from text files and appending the word and count to a dictionary as the key-value pairs. It throws me this error: if key not in wordDict: TypeError: unhashable type: 'list' Also, I am wondering of .split() is good because my text files contain different punctuation marks. Thanks ahead for those who help!''' 

split_text = text.split() 
counter = Counter(split_text) 
print(counter) 

aus:

Counter({'count': 2, 'and': 2, 'text': 2, 'to': 2, 'I': 2, 'files': 2, 'word': 2, 'am': 2, 'the': 2, 'dictionary': 1, 'a': 1, 'not': 1, 'in': 1, 'ahead': 1, 'me': 1, 'trying': 1, 'every': 1, '.split()': 1, 'type:': 1, 'my': 1, 'punctuation': 1, 'is': 1, 'key': 1, 'error:': 1, 'help!': 1, 'those': 1, 'different': 1, 'throws': 1, 'TypeError:': 1, 'contain': 1, 'wordDict:': 1, 'appending': 1, 'if': 1, 'It': 1, 'Also,': 1, 'unhashable': 1, 'from': 1, 'because': 1, 'marks.': 1, 'pairs.': 1, 'this': 1, 'key-value': 1, 'wondering': 1, 'Thanks': 1, 'of': 1, 'good': 1, "'list'": 1, 'for': 1, 'who': 1, 'as': 1}) 
+0

Dieses Beispiel kann besser mit einem mehrzeiligen Beispiel sein, str.splitlines() kann dafür verwendet werden. :) – Copperfield

+0

@ Copperfield danke für den Tipp –

0

key ist eine Liste und Sie versuchen, zu sehen, ob eine Liste in einem Wörterbuch ist das zu sehen, entspricht, wenn es einer der Schlüssel ist. Wörterbuchschlüssel können keine Listen sein, daher der Fehler "nicht abspeicherbarer Typ".

1

key ist eine Liste von durch Leerzeichen getrennten Wörtern in der aktuellen Zeile. Sie müssten auch über diese Liste iterieren.

for line in fileref: 
    keys = line.split() 
    for key in keys: 
     if key not in wordDict: 
      wordDict[key] = 1 
     else: 
      wordDict[key] += 1 

Dies kann erheblich, indem entweder die setdefault Verfahren oder ein defaultdict vom collections Modul gereinigt werden; Mit beiden können Sie es vermeiden, explizit nach einem Schlüssel zu suchen, indem Sie den Schlüssel automatisch mit einem Anfangswert hinzufügen, wenn er nicht bereits in der dict ist.

for key in keys: 
    wordDict.setdefault(key, 0) += 1 

oder

from collections import defaultdict 
wordDict = defaultdict(int) # Default to 0, since int() == 0 

... 

    for key in keys: 
     wordDict[key] += 1 
0

str.split Rückkehr eine Liste von Wörtern

>>> "hello world".split() 
['hello', 'world'] 
>>> 

und Listen oder andere veränderliches Objekt kann nicht als Schlüssel eines Wörterbuchs verwendet werden, und das ist, warum Sie Erhalten Sie den Fehler TypeError: unhashable type: 'list'.

Sie müssen durchlaufen sie einen jeden von denen gehören, auch die empfohlene Art und Weise mit einem file zu arbeiten, ist mit dem with statement

wordDict = {} 
with open(mypath + '/' + i, 'r') as fileref: 
    for line in fileref: 
     for word in line.split(): 
      if word not in wordDict: 
       wordDict[word] = 1 
      else: 
       wordDict[word] += 1 

die oben kann mit dem Einsatz Counter und einen appropriate Aufruf verkürzt werden

from collections import Counter 

with open(mypath + '/' + i, 'r') as fileref:  
    wordDict = Counter(word for line in fileref for word in line.split()) 
+0

Arbeiten ziemlich gut, danke! – Yolanda

Verwandte Themen