[英]Using list comprehension to setup a list of unique dictionaries in Python
我有以下字典
stocklist = {'a': 0, 'b': 0, 'c': 0}
我想设置一个以WIDTH高度为单位的网格,其中网格中的每个单元格都有其自己的唯一版本的存货清单,具有不同的值。 这样行吗?
stockmap = [[stocklist for w in range(WIDTH)] for h in range(HEIGHT)]
我还有其他按高度排列的列表,其中每个单元格仅包含一个值,并且它们工作正常。
但是在此之前,我试图通过使用类来解决我的问题,这是一场噩梦,因为我的实例包含一个保持相同的列表。
我担心如果我开始对上面的代码进行编码,最终会遇到同样的问题。
在您的示例中,网格的每个“单元”都指向相同的字典stocklist
。 因此,如果您修改一个“单元”,则实际上所有这些单元都会改变。
如果需要在每个单元格中存储不同的字典,则应创建库存清单的深层副本。
尝试:
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}
将不会被深复制,并且每个'单元将共享该字典。
正如我上面建议的,您需要实例化一个新对象,例如使用dict
stockmap = [[dict(stocklist) for w in range(WIDTH)] for h in range(HEIGHT)]
否则,将使用完全相同的字典实例。
让我们来看看:
以你的例子
>>> HEIGHT = 3
>>> WIDTH = 3
>>> stocklist = {'a': 0, 'b': 0, 'c': 0}
>>> stockmap = [[stocklist for w in range(WIDTH)] for h in range(HEIGHT)]
>>> stockmap
[[{'a': 0, 'b': 0, 'c': 0}, {'a': 0, 'b': 0, 'c': 0}, {'a': 0, 'b': 0, 'c': 0}], [{'a': 0, 'b': 0, 'c': 0}, {'a': 0, 'b': 0, 'c': 0}, {'a': 0, 'b': 0, 'c': 0}], [{'a': 0, 'b': 0, 'c': 0}, {'a': 0, 'b': 0, 'c': 0}, {'a': 0, 'b': 0, 'c': 0}]]
>>> stocklist['a']=9
>>> stockmap
[[{'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}], [{'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}], [{'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}]]
如您所见,修改原始字典中的一项会影响新创建的列表(网格)
而做
>>> stockmap = [[dict(stocklist) for w in range(WIDTH)] for h in range(HEIGHT)]
>>> stockmap
[[{'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}], [{'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}], [{'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}]]
>>> stocklist['a']=5
>>> stockmap
[[{'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}], [{'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}], [{'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}, {'a': 9, 'b': 0, 'c': 0}]]
保持网格不变
注意:正如@damgad正确指出的那样, dict
对于嵌套字典不起作用。 在这种情况下,您需要使用copy.deepcopy
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.