Python 如何实例化布尔二维数组?

Python 如何实例化布尔二维数组?,python,arrays,boolean,Python,Arrays,Boolean,我是Python新手,所以问题是 因此,我试图实例化一个2D数组/列表,其中包含大小为str+1行和pattern+1列的所有false 这是我的密码 memo = [] for i in range(0, len(str) + 1): memo[i] = [[False] for j in range(len(pattern) + 1)] 现在我有两个问题 在一行中有没有更像蟒蛇的方法? 另外,如果我只是创建列表,并且没有用任何东西初始化它,那么每个网格中都有什么(java等价于非

我是Python新手,所以问题是

因此,我试图实例化一个2D数组/列表,其中包含大小为str+1行和pattern+1列的所有false

这是我的密码

memo = []

for i in range(0, len(str) + 1):
    memo[i] = [[False] for j in range(len(pattern) + 1)]
现在我有两个问题

在一行中有没有更像蟒蛇的方法?
另外,如果我只是创建列表,并且没有用任何东西初始化它,那么每个网格中都有什么(java等价于非初始化,意思是用false初始化)?

一行将是
memo=[[false表示范围内的j(len(pattern)+1)],而I表示范围内的I(len(str)+1)]

请注意,应避免使用
str
作为变量名,因为它会隐藏内置的
str
类型

如果我只是创建列表,而不使用任何东西初始化它,那么每个网格中都有什么(java等价于非初始化,表示初始化为false)

没什么,它只是空的

Python列出了对其他对象的存储引用。如果未插入对列表的任何引用,则列表不包含任何内容。

使用一个在生成器中完全加载的方法:

memo = itertools.repeat(itertools.repeat(False, xrange(len(pattern) + 1)), xrange(len(str) + 1))

取决于2D列表有多大以及你打算用它来做什么,你也可以考虑使用A来存储数据:

import numpy as np
memo = np.full((len(str) + 1, len(pattern) + 1), False, dtype=bool)

# example
> np.full((3,2), False, dtype=bool)
> 
array([[False, False],
       [False, False],
       [False, False]], dtype=bool)

一个简单的方法是写:

ncols = 3  # len(string1) + 1
nrows = 4  # len(pattern1) + 1
memo = nrows * [ncols*[False]] 

>>> [[False, False, False], [False, False, False], [False, False, False], [False, False, False]]

在这种情况下,第二部分[ncols*[False]]制作了一个内部列表

这是我能想到的最短列表理解:

memo = [[False] * (len(pattern)+1) for i in range(len(str)+1)]
如果您创建了列表,但没有对其进行初始化,则列表将为空

解决此问题的另一种方法是将2D数组表示为
defaultdict
defaultdict
。这将本质上使它成为一个“稀疏”数组,因为它只包含分配了值或引用了值的条目(也称为“惰性初始化”)。即使其中的数据是以这种方式存储的,其内容也可以以类似于
列表
列表
的方式进行索引。
(即使用
备忘录[i][j]

我的意思是:

from collections import defaultdict

memo = defaultdict(lambda: defaultdict(bool))
memo[1][1] = True
print(memo[2][4])  # -> False
这将导致字典只包含迄今为止分配或引用的值:

{
    1: {
        1: True
    }, 
    2: {
        4: False
    }
}

memo=[ncols*[False]表示范围内(nrows)]