我试图从文本文件中计算每个单词,并将单词和计数附加到字典作为键值对。它抛出了这个错误:如果key不在wordDict中: TypeError:不可用类型:'list' 另外,我想知道.split()是好的,因为我的文本文件包含不同的标点符号。
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 :(得分:2)
Office.context.requirements.isSetSupported('ExcelApi', 1.3) === true
出:
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)
答案 1 :(得分: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
答案 2 :(得分:0)
key
是一个列表,您正在尝试查看列表是否在字典中,这相当于查看它是否是其中一个键。字典键canot是列表因此"不可用类型"错误。
答案 3 :(得分:0)
str.split
返回单词列表
template<typename U>
inline U& getObject(const std::string& key)
{
return dynamic_cast<U&>(*(_map.at(key)));
}
并且列表或任何其他可变对象不能用作字典的键,这就是您收到错误>>> "hello world".split()
['hello', 'world']
>>>
的原因。
您需要对其进行迭代以包含其中的每一个,同样推荐使用file的方法是使用with
statement
TypeError: unhashable type: 'list'
使用Counter和appropriate调用
可以缩短上述内容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