Python:如何使用可以附加到的空值初始化嵌套列表

时间:2019-02-13 15:31:37

标签: python nested-lists

我正在学习python并碰壁。 我试图定义一个二维列表,以后可以用来附加值。这对应于宽度为* height

的网格

我尝试使用[]初始化空列表,但随后忽略了wid。 我尝试使用None作为占位符,但随后我无法追加

wid = 3
hgt = 3
l1 = [[]*wid ] * hgt
l = [[None]*wid ] * hgt
l[1][1].append("something")

结果

l1: [[], [], []]

l: [[None, None, None], [None, None, None], [None, None, None]]

错误:

append: AttributeError: 'NoneType' object has no attribute 'append'

期望的结果:[[[], [], []], [[], [], []], [[], [], []]]

4 个答案:

答案 0 :(得分:2)

有两种方法

  1. 使用None作为占位符值,并用l[1][1] = 5
  2. 替换它
  3. 使用空列表,并通过l[1].append(5)
  4. 向其附加新元素

当前,您正在混合两种方式。 l[1][1]返回一个None值,不是列表,并且您正尝试在其上调用append

无论如何,这里有一个常见的python陷阱。当你写

mylist = [[None]*2]*3

这有两件事

  1. 创建列表[None, None]
  2. 使用此列表3次以创建另一个列表

关键是外部列表将由内部列表的3个副本组成,而不是由相同列表的3个不同副本组成。因此,每次您修改其中之一时,其余的也将被修改。因此,您需要复制内部列表。

但是对于2D数组,最好的方法是使用numpy

x = np.zeros(m, n)
x[1, 2] = 5

答案 1 :(得分:1)

尝试在列表理解中使用列表理解:

>>> [ [ [] for i in range(wid) ] for i in range(hgt) ]
[[[], [], []], [[], [], []], [[], [], []]]

请注意,这是列表乘法的首选,因为每个列表都是唯一的。比较:

>>> x = [ [[] for i in range(wid)] for i in range(hgt) ]
>>> x[1][1].append('a')
>>> x
[[[], [], []], [[], ['a'], []], [[], [], []]]

vs。

>>> y = [ [[]] * wid for i in range(hgt) ]
>>> y[1][1].append('a')
>>> y
[[[], [], []], [['a'], ['a'], ['a']], [[], [], []]]

vs。

>>> z = [ [[]] * wid ] * hgt
>>> z[1][1].append('a')
>>> z
[[['a'], ['a'], ['a']], [['a'], ['a'], ['a']], [['a'], ['a'], ['a']]]

在第二和第三种情况下,“ a”出现在多个单元格中!并且使用None不能避免此问题:

>>> m = [ [None] * wid ] * hgt
>>> m
[[None, None, None], [None, None, None], [None, None, None]]
>>> if m[1][1] is None:
...     m[1][1] = ['a']
... else:
...     m[1][1].append('a')
...
>>> m
[[None, ['a'], None], [None, ['a'], None], [None, ['a'], None]]

tl; dr-使用双列表理解。我认为,无论如何,这是最易读的选项。

答案 2 :(得分:0)

>>> x = 5
>>> y = 5
>>> [[None for _ in range(x)] for _ in range(y)]
[[None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None]]

除非您真的知道自己刚刚创建了共享引用,否则不要使用[[None]*x]*y

答案 3 :(得分:0)

如果要处理矩阵,则可以使用numpy:

import numpy as np

my_matrix = np.zeros((rows, columns) # with 2 dimentions