我是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)?
答案 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
}
}