如何使用重叠键更新python中的嵌套字典?

时间:2014-01-30 03:20:29

标签: python dictionary

我只想在字典中更新1个字典值,但它似乎更新了2个键的并集:

Y = dict(zip(['A', 'B'], [dict.fromkeys(range(2010,2014), [])] * 2))
zz = {'A':{2012: [(666,999)], 2013: []}, 'B':{2010:[], 2011:[(666,999)]}}

Y['A'][2012] = zz['A'][2012]

结果:

{'A': {2010: [], 2011: [], 2012: [(666, 999)], 2013: []}, 'B': {2010: [], 2011: [], 2012: [(666, 999)], 2013: []}}

我只想更新2012年的'A'。

我是初学python程序员。

由于

2 个答案:

答案 0 :(得分:2)

这部分:

[dict.fromkeys(range(2010,2014), [])] * 2

创建一个列表,其中两个元素都是相同的dict对象。此外,在该单个字典中,所有4个值都是相同的列表对象。

这部分:

Y['A'][2012] = zz['A'][2012]

获取存储在zz['A'][2012]中的列表对象,并使Y['A'][2012]也引用该列表。

您可以通过执行以下操作,使用独立列表制作独立的词组:

Y = {key1: {key2: [] for key2 in range(2010, 2014)} for key1 in ['A', 'B']}

由于我不确定您要对Y['A'][2012] = zz['A'][2012]做什么,我无法在那里提供解决方案。

答案 1 :(得分:0)

此:

[dict.fromkeys(range(2010,2014), [])] * 2

创建两个相同的词典,而不是两个相同词典的副本。因此,Y['A'][2012]Y['B'][2012]相同。

您可以通过执行以下操作来解决此问题:

y = dict(zip(['A', 'B'], [dict.fromkeys(range(2010,2014), []) for _ in [_,_]]))

相关:

List of lists changes reflected across sublists unexpectedly

Generating sublists using multiplication ( * ) unexpected behavior

Nested List Indices