使用list comprehension在Python中设置唯一字典列表

时间:2015-11-06 12:41:12

标签: python dictionary list-comprehension nested-lists

我有以下字典

stocklist = {'a': 0, 'b': 0, 'c': 0}

我想通过WIDTH设置一个HEIGHT网格,其中网格中的每个单元格都有自己独特的具有不同值的库存清单。这有用吗?

stockmap = [[stocklist for w in range(WIDTH)] for h in range(HEIGHT)]

我有其他宽度和高度列表,其中每个单元格只包含一个值,它们工作正常。

但在此之前,我尝试使用Classes来解决我的问题,这是一场噩梦,因为我的实例包含一个保持相同的列表。

我担心如果我开始编码上面的话,我最终会遇到同样的问题。

2 个答案:

答案 0 :(得分:4)

在您的示例中,网格的每个“单元格”都将指向同一个字典 - stocklist。因此,如果您修改一个“单元格”,实际上所有单元格都会发生变化。

如果您需要在每个单元格中存储不同的dict,您应该创建库存清单的深层副本。

尝试:

import copy
stocklist = {'a': 0, 'b': 0, 'c': 0}
stockmap = [[copy.deepcopy(stocklist) for w in range(WIDTH)] for h in range(HEIGHT)]

在简单示例中,stocklist不包含任何嵌套字典

`stockmap = [[dict(stocklist) for w in range(WIDTH)] for h in range(HEIGHT)]`

会奏效。但请记住,如果您的stocklist类似于{'a': 0, 'b': {'c': 0}},则内部嵌套字典{'c': 0}将不会被深层复制,并且每个“单元格”都将共享该字典。

答案 1 :(得分:1)

如上所述,您需要实例化一个新对象,例如使用dict stockmap = [范围(W)中的w的[[dict(stocklist)]范围内的h(HEIGHT)] 否则将使用相同的字典实例。 我们来看看吧: 用你的例子 >>>高度= 3 >>> WIDTH = 3 >>> stocklist = {' a':0,' b':0,' c':0} >>> stockmap = [[范围内W的库存清单(WIDTH)],范围内的h(HEIGHT)] >>> stockmap [[{' a':0,' b':0,' c':0},{' a':0,& #39; b':0,' c':0},{' a':0,' b':0,' c& #39;:0}],[{' a':0,' b':0,' c':0},{' a& #39;:0,' b':0,' c':0},{' a':0,' b': 0,' c':0}],[{' a':0,' b':0,' c':0} ,{' a':0,'':0,' c':0},{' a':0,&# 39; b':0,' c':0}]] >>> stocklist ['一个'] = 9 >>> stockmap [[{' a':9,' b':0,' c':0},{' a':9,& #39; b':0,' c':0},{' a':9,' b':0,' c& #39;:0}],[{' a':9,' b':0,' c':0},{' a& #39;:9,' b':0,' c':0},{' a':9,' b': 0,' c':0}],[{' a':9,'':0,' c':0} ,{' a':9,':0,' c':0},{' a':9,&# 39; b':0,' c':0}]] 你可以清楚地看到,修改原始字典中的一个项会影响新创建的列表(网格) 做的 >>> stockmap = [范围(W)中的w的[[dict(stocklist)]范围内的h(HEIGHT)] >>> stockmap [[{' a':9,' b':0,' c':0},{' a':9,& #39; b':0,' c':0},{' a':9,' b':0,' c& #39;:0}],[{' a':9,' b':0,' c':0},{' a& #39;:9,' b':0,' c':0},{' a':9,' b': 0,' c':0}],[{' a':9,'':0,' c':0} ,{' a':9,':0,' c':0},{' a':9,&# 39; b':0,' c':0}]] >>> stocklist ['一个'] = 5 >>> stockmap [[{' a':9,' b':0,' c':0},{' a':9,& #39; b':0,' c':0},{' a':9,' b':0,' c& #39;:0}],[{' a':9,' b':0,' c':0},{' a& #39;:9,' b':0,' c':0},{' a':9,' b': 0,' c':0}],[{' a':9,'':0,' c':0} ,{' a':9,':0,' c':0},{' a':9,&# 39; b':0,' c':0}]] 使网格保持不变 注意:正如@damgad正确指出的那样,dict不适用于嵌套字典。在这种情况下,您需要使用copy.deepcopy