如何在Python中更新dict中特定键的值

时间:2013-11-07 21:58:50

标签: python dictionary

我用这个创建了一个词典:

a = dict.fromkeys([round(x*0.1,1) for x in range(10)], [0,0])

它会给我以下结果:

>>> a
{0.0: [0, 0], 0.5: [0, 0], 0.2: [0, 0], 0.4: [0, 0], 0.8: [0, 0], 0.6: [0, 0], 0.3: [0, 0], 0.1: [0, 0], 0.9: [0, 0], 0.7: [0, 0]}

我只想更新key = 0.5的第二个值,例如。我使用以下代码:

a[0.5][1]=a[0.5][1]+10

然而,事实证明它更新了所有键的所有第二个值。

>>> a
{0.0: [0, 10], 0.5: [0, 10], 0.2: [0, 10], 0.4: [0, 10], 0.8: [0, 10], 0.6: [0, 10], 0.3: [0, 10], 0.1: [0, 10], 0.9: [0, 10], 0.7: [0, 10]}

我想知道是否有办法做到这一点?

非常感谢提前!

4 个答案:

答案 0 :(得分:4)

不要将dict.fromkeys与可变值一起使用,它只是将对同一列表对象的引用复制到所有键。因此,更改任何一个参考将影响所有列表。

>>> d = dict.fromkeys('abcdef', [])
>>> [id(x) for x in d.values()]
[164654156, 164654156, 164654156, 164654156, 164654156, 164654156]

改为使用dict comprehension

>>> d = {k:[] for k in  'abcdef'}
>>> [id(x) for x in d.values()]
[164621484, 164653580, 164331340, 164653804, 164653900, 164653836]

对于您的代码,它将是:

a = {round(x*0.1,1): [0, 0] for _ in range(10)}

答案 1 :(得分:0)

那是因为你对dict中的每个值使用了相同的列表。

不要将fromkeys与可变值一起使用。使用词典理解:

a = {round(x*0.1, 1): [0, 0] for x in range(10)}

或者,如果你坚持使用2.6,那就是假字典理解:

a = dict((round(x*0.1, 1), [0, 0]) for x in range(10))

答案 2 :(得分:0)

所有字典条目都引用相同的列表。你最好以不同的方式创建字典:

a = {}
for x in range(10):
    a[round(x*0.1,1)] = [0,0] 

答案 3 :(得分:0)

您使用相同的列表实例作为所有键的值。而不是:

a=dict.fromkeys([round(x*0.1,1) for x in range(10)], [0,0])

像这样初始化:

a=dict((round(x*0.1,1), [0, 0]) for x in range(10))