keyError:' ba'使用setDefault方法时

时间:2015-11-20 19:59:43

标签: python dictionary keyerror

所以我基本上试图使用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)

我试图得到这样的东西

st = {ba : {a : 1}
      an : {a : 2}
      .......
     }

出于某种原因,我得到了一个关键错误:' ba'。所以,我应该把' ba'在做这个之前的st dict?还是有办法添加' ba'以这种方式关键

2 个答案:

答案 0 :(得分:0)

您永远不会向st添加新密钥,因此它是空的。

您正尝试访问st['ba']并使用其setdefault方法,就像st['ba']是字典一样,但st['ba']不存在。

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

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

或:

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

答案 1 :(得分:0)

您需要支持在两个级别动态生成dict个条目。对于这种特殊情况,对于至少一个级别使用defaultdict可能最容易(因为你正在计算内容,Counter为内部dict }})。

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)

这简化了您的代码(没有明确处理丢失的密钥),但它确实意味着您的输出不会仅使用{}包装。如果您希望它最终看起来像嵌套dict(和/或需要停止自动生成密钥defaultdictCounter),您可以添加:

st = {k: dict(v) for k, v in st.items()}
print之前

,它会转换回dict的普通dict