【问题标题】:Comprehension to instantiate a boolean 2D array?理解实例化布尔二维数组?
【发布时间】:2016-12-25 06:00:25
【问题描述】:

我是 Python 新手,所以这个问题,

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

这是我的代码,

memo = []

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

现在我有两个问题,

有没有更 Pythonic 的方式在 1 行中执行此操作? 另外,如果我只是创建列表并且不使用任何东西对其进行初始化,那么每个网格中都有什么(java相当于非初始化的意思是用false初始化)?

【问题讨论】:

  • memo = [ncols*[False] for _ in range(nrows)]

标签: python arrays boolean


【解决方案1】:

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

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

如果你创建了列表并且不初始化它,它将是空的。

解决必须这样做的另一种方法是将二维数组表示为defaultdictdefaultdicts。从本质上讲,这将使它成为一个“稀疏”数组,因为它只会包含被赋值或引用其值的条目——也称为“延迟初始化”。即使其中的数据以这种方式存储,其内容也可以以类似于listlists 的方式进行索引。
(即使用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
    }
}

【讨论】:

    【解决方案2】:

    简写方式是:

    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]] 是内部列表之一

    【讨论】:

      【解决方案3】:

      根据 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)
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          附带说明,请记住,应避免使用 str 作为变量名,因为它会影响内置的 str 类型。

          如果我只是创建列表并且不使用任何东西对其进行初始化,那么每个网格中有什么(java 相当于非初始化的意思是用 false 初始化)?

          什么都没有,就是空的。

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

          【讨论】:

            猜你喜欢
            • 2011-12-26
            • 2022-01-23
            • 1970-01-01
            • 1970-01-01
            • 2015-04-17
            • 1970-01-01
            • 2020-04-28
            • 2011-05-04
            • 2021-02-04
            相关资源
            最近更新 更多