keyError:使用setDefault方法时出现“ba”

2024-06-10 21:16:35 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我基本上是尝试使用setdefault方法将字典放入字典中。在

text = 'banana'
k = 2

st = {}
circ_text = text + text[:k]
for i in range(len(circ_text) - k):
    kgram = circ_text[i:i + k]
    next_char = circ_text[i + k]
    st[kgram].setdefault(next_char, 0)
    st[kgram][next_char] += 1
print(st)

我正试着得到这样的东西

^{pr2}$

不知为什么我得到了一个键错误:“ba”。所以我应该在做这件事之前把“ba”放在st dict里?或者有没有办法用这种方式加上“ba”键


Tags: 方法textinforlen字典rangenext
2条回答

您需要在两个级别支持dict条目的动态生成。对于这个特定的例子,可能最简单的方法是至少在一个级别中使用defaultdict(并且由于您在计算事物,所以对于内部的dict,使用Counter)。在

from collections import defaultdict, Counter

text = 'banana'
k = 2

st = defaultdict(Counter)
circ_text = text + text[:k]
for i in range(len(circ_text) - k):
    kgram = circ_text[i:i + k]
    next_char = circ_text[i + k]
    st[kgram][next_char] += 1
print(st)

这简化了您的代码(不显式地处理丢失的键),尽管这意味着您的输出将不仅仅使用{}包装。如果您希望它在结尾看起来像嵌套的dicts(和/或需要停止自动激活键,如defaultdictCounterdo),您可以添加:

^{pr2}$

print之前,它将转换回dictdict的普通dict

您从不向st添加新密钥,因此它是空的。在

您试图访问st['ba']并使用其setdefault方法,就好像st['ba']是一个字典,但是{}不存在。在

也许您想改为使用st.setdefault,并为st['ba']设置默认值:

st.setdefault(kgram, {})
st[kgram].setdefault(next_char, 0)
st[kgram][next_char] += 1

或者:

^{pr2}$

相关问题 更多 >