从yield在Python中添加嵌套字典

从yield在Python中添加嵌套字典,python,dictionary,nested,Python,Dictionary,Nested,如果我这样做: x1={'Count': 11, 'Name': 'Andrew'} x2={'Count': 14, 'Name': 'Matt'} x3={'Count': 17, 'Name': 'Devin'} x4={'Count': 20, 'Name': 'Andrew'} x1 vars=[x1,x2,x3,x4] for i in vars: my_dict[i[group_by_column]]=i my_dict 然后我得到: defaultdict(int,

如果我这样做:

x1={'Count': 11, 'Name': 'Andrew'}
x2={'Count': 14, 'Name': 'Matt'}
x3={'Count': 17, 'Name': 'Devin'}
x4={'Count': 20, 'Name': 'Andrew'}
x1

vars=[x1,x2,x3,x4]
for i in vars:
    my_dict[i[group_by_column]]=i
my_dict
然后我得到:

defaultdict(int,
            {'Andrew': {'Count': 20, 'Name': 'Andrew'},
             'Devin': {'Count': 17, 'Name': 'Devin'},
             'Geoff': {'Count': 10, 'Name': 'Geoff'},
             'Matt': {'Count': 14, 'Name': 'Matt'}})
这正是我想要的

然而,当我试图从一个内置了
yield
的对象复制它时,它会不断覆盖字典中的值。例如,
cast\u record\u stream
是一个函数结果,根据请求生成以下词典:

{'Count': 11, 'Name': 'Andrew'}
{'Count': 14, 'Name': 'Matt'}
{'Count': 17, 'Name': 'Devin'}
{'Count': 20, 'Name': 'Andrew'}
{'Count': 5, 'Name': 'Geoff'}
{'Count': 10, 'Name': 'Geoff'}
所以当我运行这个函数时,结果是错误的:

for line in cast_record_stream:
    record_name=line['Name']
    my_dict[record_name]=line

    defaultdict(<type 'int'>, {'Devin': {'Count': 10, 'Name': 'Geoff'}, 
'Matt': {'Count': 10, 'Name': 'Geoff'}, 
'Geoff': {'Count': 10, 'Name': 'Geoff'}, 
'Andrew': {'Count': 10, 'Name': 'Geoff'}})
对于cast\u记录\u流中的行:
记录名称=行['name']
my_dict[记录名称]=行
defaultdict(,{'Devin':{'Count':10,'Name':'Geoff'},
马特:{'Count':10,'Name':'Geoff'},
'杰夫':{'Count':10,'姓名':'Geoff'},
安德鲁:{'Count':10,'Name':'Geoff'})

我在这里制造了一个我看不见的问题吗?我想它一次只能增加一个值。

有几个问题。首先,我假设cast\u record\u stream是一个函数,所以您的第一行应该是

for line in cast_record_stream():
字典不能有重复的键。如果迭代器返回两个Geoffs,后者将始终覆盖前者。如果你希望有重复的名字,你可能应该考虑一种不同的方法来存储你的数据比字典。
我无法重现你的问题。这是一个完整的复制品,只是效果很好。这表明您在OP中描述的想法是正确的,并且在实际代码中还存在一些其他错误

cast_list = [
    {'Count': 11, 'Name': 'Andrew'},
    {'Count': 14, 'Name': 'Matt'},
    {'Count': 17, 'Name': 'Devin'},
    {'Count': 20, 'Name': 'Andrew'},
    {'Count': 5, 'Name': 'Geoff'},
    {'Count': 10, 'Name': 'Geoff'},
]

def cast_record_stream():
    for record in cast_list:
        yield record

from collections import defaultdict
d = {}
for record in cast_record_stream():
    print record
    d[record['Name']] = record
print d

根据下面评论中的讨论,我认为您有时会存储record_name=line['name'],但有时不会更新,因为您正在迭代一些不应该更新的内容,可能会导致一个for循环,该循环从不执行将更新记录名称的行。

这可能有助于用所讨论的
yield
显示您的代码。它是多个链接在一起的函数,因此可能会混淆。重要的一点是,它生成了我上面列出的每一个词典,其中一些词典有重复的
名称
我的猜测:
cast\u record\u stream
反复修改并生成相同的词典。请确保在让步之前创建一个新的dict。不,如果我在调用最后一个循环后添加一行
print line
,它将在每次迭代中生成不同的字典。它会打印一个“不同”(外观)的dict,因为在打印之前您没有更改它们。发布生成器函数后,我大约99.7%确定这就是问题所在。这是一个包含所有单独字典的函数结果,但由于
产生
片段,这些结果一次出现一个。请注意
'Devin':{'Count':10,'Name':'Geoff}
与dict中的名称不同。dict从生成器中出来时具有正确(不同)的名称,但在打印前都已更改。再一次,我的猜测是这些都指向同一个dict实例。所以我正在尝试这个,但它不起作用…..它不能将
cast\u record\u stream
识别为一个函数,因为在我的代码中,它是一个存储前一个函数的
yield
的对象,尽管你说它是一个生成器函数。如果这是一个收益率,那么你不能迭代它。你只要加上那一个收益率,你就完成了,现在。在其他地方有一个迭代(或者有一个生成器是很愚蠢的),你可以在那里构建完整的dict。对不起,我不确定我是否遵循了。我是python新手,我能说的就是
cast\u recode\u stream
不是一个函数,而是
的存储产生以前函数的结果。我不想发布所有内容,因为这是针对某个方面的培训,我担心隐私问题。如果是这样,那么您正在迭代的内容就不是您认为您正在迭代的内容。在调试程序中查看这部分代码。我(认为)我了解
产生的
功能,那么我如何以可编辑的方式获取它产生的每个对象并将其存储在字典中?