繁体   English   中英

如何使用理解语法创建一个包含 N 个列表的列表,每个列表包含 N 个不同的字典?

[英]How to create a list containing N Lists each containing N distinct dictionaries using comprehension syntax?

    oneCounts = [[{'l':0,'r':0,'t':0,'b':0}] * N for i in range(0,N)]     
    oneCounts[0][1]['t'] = 3

在上面的代码中,在特定字典上设置键值会导致同一列表中的所有字典将它们的 t 键值设置为相同的值。 这出乎我的意料。 我错过了什么?

将第一行更改为

oneCounts = [[{'l':0,'r':0,'t':0,'b':0} for _ in range(N)] for i in range(0, N)] 
# oneCounts = [[{'l':0,'r':0,'t':0,'b':0} for _ in range(N)] for _ in range(N)] 

为了创建独立的词典。

[x] * n创建一个包含对同一对象x的 n 个引用的列表。 您应该只在x是不可变类型时使用该语法,例如int

意外结果背后的原因是您只调用了一次构造函数,然后使用了 N 次相同的对象。 因此,实际上,您向oneCounts追加了 N 次相同的对象,因为包含字典的列表具有相同的引用。

尝试以下操作:

oneCounts = []
for i in range(N):
    oneCounts.append([{'l':0,'r':0,'t':0,'b':0} for j in range(N)])

这里, oneCounts是一个包含 N 个列表的列表,每个列表包含 N 个单独的字典。

编辑:我刚刚注意到用户“schwobaseggl”给出的答案。 它和我的代码做同样的事情,但输入更少。 我个人更喜欢这个答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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