繁体   English   中英

使用列表推导在Python中设置唯一词典的列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM