2016-12-15 2 views
-1

Я пытаюсь подсчитать каждое слово из текстовых файлов и добавить слово и считать словарем в качестве пар ключ-значение. Это бросает мне эту ошибку: if key not in wordDict: TypeError: unhashable type: 'list' Кроме того, мне интересно .split() хорошо, потому что мои текстовые файлы содержат разные знаки препинания.Значения приращения Python в словаре

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

Если вы хотите использовать _additional_ seperator, вы можете использовать 'line.replace (other, '')' перед распаковкой. – MSeifert

ответ

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) 

из:

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

Этот пример может быть лучше с примером с несколькими линиями, для этого может использоваться str.splitlines(). :) – Copperfield

+0

@ Copperfield для подсказки –

0

key список и вы пытаетесь увидеть, если список в словаре, что эквивалентно, видя, если это один из ключей. Ключи словаря могут быть списками, следовательно, ошибка «неубираемого типа».

1

key - это список слов, разделенных пробелами, найденных в текущей строке. Вам нужно будет перебирать и этот список.

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

Это может быть очищен значительно либо с помощью метода setdefault или defaultdict из collections модуля; оба позволяют избежать явной проверки ключа, автоматически добавляя ключ с начальным значением, если он еще не находится в dict.

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

или

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

... 

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

str.split возвращает список слов

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

и списки или любой другой изменяемый объект не может быть использован в качестве ключа словаря, и именно поэтому вам получите ошибку TypeError: unhashable type: 'list'.

Вам нужно перебрать, чтобы она включала каждый из тех, также рекомендуемый способ работы с file это с 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 

выше, может быть сокращено с использованием Counter и appropriate вызов к нему

from collections import Counter 

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

Работаю очень хорошо, спасибо! – Yolanda