Python在字典中增加值

时间:2016-12-15 01:54:18

标签: python dictionary

我试图从文本文件中计算每个单词,并将单词和计数附加到字典作为键值对。它抛出了这个错误:如果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

4 个答案:

答案 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'

使用Counterappropriate调用

可以缩短上述内容
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