更新具有整数键的字典

3

我正在处理一个简短的任务,需要读取一个 .txt 文件并创建一个字典,在该字典中,键是句子中单词的数量,值是特定长度句子的数量。我已经读入文件并确定了每个句子的长度,但是我在创建字典方面遇到了麻烦。

我已经初始化了字典,并尝试使用以下代码更新它(在循环语句中迭代句子):

for snt in sentences:
    words = snt.split(' ')
    sDict[len(words)]+=1

在第一次迭代时,它会给我一个KeyError。我确定这与我的语法有关,但我不知道如何更新字典中的现有条目。


1
如果正在更新的键的值尚未创建,您确实无法更新字典。使用collections中的defaultdict或使用if语句来检查字典中是否存在len(words)作为键。 - Abdou
为了完整起见,还有常常被忽略的dict.get()方法... sDict[len(words)] = sDict.get(len(words), 0) + 1 - wwii
2个回答

3

当你初始化字典时,它是空的。接下来要做的是查找一个键,以便更新其值,但是这个键还不存在,因为字典是空的。对你的代码进行最小的更改可能是使用get字典方法。而不是这样:

sDict[len(words)]+=1

请使用以下内容:
sDict[len(words)] = sDict.get(len(words), 0) + 1

get 方法查找一个键,但如果键不存在,则返回默认值。默认的默认值是 None,你可以指定一个不同的默认值,这是第二个参数,在这个例子中是 0

更好的解决方案可能是使用 collections.Counter,它处理了常见的计数出现次数的用例:

import collections
s = map(str.split, sentences)
sDict = collections.Counter(map(len, s))

谢谢您的解释!最终我使用了一个defaultdict让它正常工作了,但是知道为什么它之前不能正常工作也很好。 - Claycrusher

2

defaultdict是为了解决这个问题而发明的:

from collections import defaultdict

sDict = defaultdict(int)
for snt in sentences:
    sDict[len(snt.split())] += 1

如果在您的任务上下文中只能使用纯字典,则需要在递增其值之前测试键是否存在,以防止 KeyError

sDict = {}
for snt in sentences:
    num_words = len(snt.split())
    if num_words in sDict:
        sDict[num_words] += 1
    else:
        sDict[num_words] = 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接