理解实例化一个布尔2D数组?

时间:2016-08-18 10:32:45

标签: python arrays boolean

我是Python的新手,因此问题,

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

这是我的代码,

memo = []

for i in range(0, len(str) + 1):
    memo[i] = [[False] for j in range(len(pattern) + 1)]

现在我有两个问题,

在一行中有更多的pythonic方式吗? 另外,如果我只是创建列表并且不用任何东西初始化它,那么每个网格中有什么(java等价的非初始化意味着初始化为false)?

5 个答案:

答案 0 :(得分:3)

单行将是memo = [[False for j in range(len(pattern) + 1)] for i in range(len(str) + 1)]

作为附注,请注意,应避免使用str作为变量名,因为它会影响内置的str类型。

  

如果我只创建列表并且不用任何东西初始化它,那么每个网格中有什么(java等价的非初始化意味着初始化为false)?

没什么,它只是空的。

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

答案 1 :(得分:1)

根据2d列表的大小以及您打算使用它做什么,您可能还会考虑使用numpy ndarray来存储数据:

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)

答案 2 :(得分:0)

使用itertools.repeat aproach,完全加载到生成器中:

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

答案 3 :(得分:0)

一个简短的方法是写:

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]]构成一个内部列表

答案 4 :(得分:0)

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

memo = [[False] * (len(pattern)+1) for i in range(len(str)+1)]

如果您创建了列表并且没有对其进行初始化,则该列表将为空。

解决这个问题的另一种方法是将2D数组表示为defaultdict defaultdict。这基本上使它成为一个稀疏的"数组在某种意义上说它只有一个条目,它们被分配了值或者它们的值被引用 - 也被称为"延迟初始化"。即使其中的数据以这种方式存储,其内容也可以采用与list list的方式类似的方式编制索引。 (即使用memo[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
    }
}