所以我基本上试图使用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'以这种方式关键
答案 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
(和/或需要停止自动生成密钥defaultdict
和Counter
),您可以添加:
st = {k: dict(v) for k, v in st.items()}
在print
之前,它会转换回dict
的普通dict
。