更新 defaultdict 下的嵌套字典

Updating the nested dictionary under defaultdict

尝试在嵌套 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

如果你想配对元素,你必须使用 zip,而不是双 for 循环。

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 of defaultdict of 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}}.