在一个任务上更新多个dicts

时间:2012-03-04 17:47:54

标签: python dictionary

我有一个词典,我已经添加了10个空词的列表值。 然后我尝试将单个值添加到列表中的一个dicts。 但似乎我将它设置为列表中的所有dicts。 有任何想法吗?我怎么能实现它这个不能工作呢?

bids={}
bids[1]=[{}]*10
bids[1][0][1]=0

出价打印为

{1: [{1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}]}

虽然我期待:

{1: [{}, {1: 0}, {}, {}, {}, {}, {}, {}, {}, {}]}

3 个答案:

答案 0 :(得分:6)

[{}]*10将创建一个列表,其中包含对相同字典对象的10个引用。通过操纵这一个实例,这些更改显然会影响整个列表。

改为使用[{} for _ in range(10)]

答案 1 :(得分:4)

[{}]*10

创建一个空字典,然后创建一个包含10个元素的列表,所有这些元素都是该字典。在代码中,它等同于:

d = {}
[d, d, d, d, d, d, d, d, d, d]

您需要一个包含10个不同词典的列表,这些词典最初都是空的。在代码中,您将其编写为:

[{}, {}, {}, {}, {}, {}, {}, {}, {}, {}]

使用list comprehension

[{} for _ in range(10)]

答案 2 :(得分:0)

一种不同的方法是,您可能希望或能够使每个值成为dicts的字典,而不是您计划使用它们的其他内容:

from collections import defaultdict

bids={}
bids[1]=defaultdict(dict)
bids[1][0][1]=0

print bids
# {1: defaultdict(<type 'dict'>, {0: {1: 0}})}

每次引用一个值时,每个值都会自动初始化为一个单独的空字典。字典不像列表那样保留顺序,但这是你不需要的东西。即使是这样,您也可以根据需要通过按键对它们进行排序。