从yield中添加Python中的嵌套字典

时间:2016-08-04 15:56:03

标签: 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,
            {'Andrew': {'Count': 20, 'Name': 'Andrew'},
             'Devin': {'Count': 17, 'Name': 'Devin'},
             'Geoff': {'Count': 10, 'Name': 'Geoff'},
             'Matt': {'Count': 14, 'Name': 'Matt'}})

这正是我想要的。

但是,当我尝试从内置yield的对象复制它时,它会在字典中保留重写值。例如,cast_record_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'}})

我在这里创造了一个我看不到的问题吗?我想它一次只能添加一个值。

2 个答案:

答案 0 :(得分:0)

我无法重现您的问题。这是一个完整的复制品,除了它完美的工作。这表明您在OP中描述的想法是正确的,并且您在实际代码中还有其他一些错误。

$(function() {
    var svg = d3.select("#mySVG")
  .call(d3.zoom().on("zoom", function () {
    svg.attr("transform", "translate(" + d3.event.transform.x + " " + d3.event.transform.y + ") scale(" + d3.event.transform.k + ")");
  }));

  // For test purposes
  //$('#mySVG').css('transform', 'scale(2)');
});

根据下面评论中的讨论,我认为你有时会存储record_name = line [&#39; Name&#39;],但有时它不会更新,因为你正在迭代你不应该的东西,可能导致for循环永远不会执行更新record_name的行。

答案 1 :(得分:-1)

有几个问题。首先,我假设cast_record_stream是一个函数,所以你的第一行应该是

for line in cast_record_stream():

词典不能有重复的键。如果你的迭代器返回两个Geoff,后者将始终覆盖前者。如果您希望有重复的名称,您可能应该考虑使用不同的方法来存储数据而不是字典。

[R