当尝试在嵌套的collection.defaultdict
Python下更新我的字典时,我给出了一个错误
说
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "program.py", line 18, in train_ngrams
if graphemes[i] not in mydict[phonemes[i]].keys():
AttributeError: 'str' object has no attribute 'keys'
我的代码:
import csv
from collections import defaultdict
def train_ngrams(train_file):
mydict = defaultdict(dict)
phonemes = []
graphemes = []
with open(train_file, 'r') as f:
reader = csv.reader(f)
next(reader)
for p, g in reader:
phonemes += p.split()
graphemes += g.split()
for i in range(len(phonemes)):
if phonemes[i] not in mydict.keys():
mydict.update({phonemes[i] : graphemes[i]})
if graphemes[i] not in mydict[phonemes[i]].keys():
mydict[phonemes[i]].update({phonemes[i] : (graphemes.count(graphemes[i]) for graphemes[i] in graphemes) - 1})
else:
mydict[phonemes[i]][graphemes[i]] += 1
当我迭代csv文件时,我正在尝试更新字典。在这里,我首先要检查它是否已经在defaultdict
中。如果没有,那么我希望创建一个键和值对。
defaultdict
中的值实际上将在稍后用于实现存储一些频率内容的嵌套普通字典。
以下是一个例子:
defaultdict(<class 'dict'>, {'T': {'t': 2}, 'UH': {'oo': 1}})
处理此错误的简洁方法是什么?请注意,此部分需要defaultdict
。
编辑:
train_ngrams("training-data-ex1.csv")
所需的输出应为
defaultdict(<class 'dict'>, {'T': {'t': 2}, 'UH': {'oo': 1}})
编辑:
示例txt文件
phonemes,graphemes
T UH T,t oo t
答案 0 :(得分:1)
如果你想配对元素,你必须使用zip
,而不是双循环。
mydict = collections.defaultdict(lambda: collections.defaultdict(int))
with open("training-data-ex1.csv") as f:
reader = csv.reader(f)
next(reader) # skip header
for phonemes, graphemes in reader:
for p, g in zip(phonemes.split(), graphemes.split()):
mydict[p][g] += 1
这使用defaultdict
defaultdict
int
,因此结果看起来有点奇怪,但它基本上就是你想要的:defaultdict(<function <lambda> at 0x7fd297740840>, {'T': defaultdict(<class 'int'>, {'t': 2}), 'UH': defaultdict(<class 'int'>, {'oo': 1})})
,或者,没有全部那个defaultdict
样板,{'T': {'t': 2}, 'UH': {'oo': 1}}
。