我正在学习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'
期望的结果:[[[], [], []], [[], [], []], [[], [], []]]
答案 0 :(得分:2)
有两种方法
None
作为占位符值,并用l[1][1] = 5
l[1].append(5)
当前,您正在混合两种方式。 l[1][1]
返回一个None
值,不是列表,并且您正尝试在其上调用append
。
无论如何,这里有一个常见的python陷阱。当你写
mylist = [[None]*2]*3
这有两件事
[None, None]
关键是外部列表将由内部列表的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