提问人:Grzegorz Lippe 提问时间:8/12/2022 更新时间:8/13/2022 访问量:865
如何创建带有 python 列表的“矩阵”?[复制]
How do I create a "matrix" with a python list? [duplicate]
问:
我有一个问题,我不能使用 numpy,我第一次偶然发现 python 中的一些奇怪的东西。
下面是一个最小的示例:
a = [[0] * 3] * 3
print(a)
# will output [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
# as expected
a[1][1] = 1
# I expect : [[0, 0, 0], [0, 1, 0], [0, 0, 0]],
# but I get:
print(a)
# will output [[0, 1, 0], [0, 1, 0], [0, 1, 0]]
# ? ?
如何创建列表列表,其中所有元素都相互独立?
如果有人打扰,你能解释一下,那里会发生什么吗?
答:
2赞
Addison Schmidt
8/12/2022
#1
这里发生的情况是,对同一列表的引用(从 获取的引用)在新列表中放置了 3 次,而不是在新列表中放置了 3 个不同的列表。做你想做的事的一种方法是:[0] * 3
a = [[[0] * 3] for _ in range(3)]
评论
0赞
Grzegorz Lippe
8/15/2022
好的,但是为什么 Python 不在内部语句中这样做呢?如果 python 使用 创建引用,那么为什么它的行为不是这样的:* n
Python a[1][1] = 1 # Output [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
0赞
Eldellano
8/12/2022
#2
a = list()
n = 3
for i in range(n):
a.append([0] * n)
a[1][1] = 1
print(a)
1赞
Javad
8/12/2022
#3
使用以下所有代码片段,您可以使用 python 创建一个 3 * 3 矩阵:
第一种方法:在每行的循环内追加列
rows = 3
cols = 3
lst = []
matrix = []
for i in range(rows):
for j in range(cols):
lst.append(0)
matrix.append(lst)
lst.clear()
print(matrix)
# the output will be: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
matrix[1][1] = 1
print(matrix)
# the output will be: [[0, 0, 0], [0, 1, 0], [0, 0, 0]]
第二种方法:1 个列表推导在外部,1 个串联操作在里面
rows = 3
cols = 3
matrix = [[0] * cols for _ in range(rows)]
print(matrix)
# the output will be: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
matrix[1][1] = 1
print(matrix)
# the output will be: [[0, 0, 0], [0, 1, 0], [0, 0, 0]]
第三种方法:1 个列表推导在里面,1 个串联运算在外
rows = 3
cols = 3
matrix = [[0 for _ in range(cols)]] * rows
print(matrix)
# the output will be: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
matrix[1][1] = 1
print(matrix)
# the output will be: [[0, 0, 0], [0, 1, 0], [0, 0, 0]]
第四种方法:使用 numpy
包
import numpy as np
rows = 3
cols = 3
size = rows*cols
matrix = np.array([0]*size).reshape(rows,cols)
print(matrix)
# the output will be: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
matrix[1][1] = 1
print(matrix)
# the output will be: [[0, 0, 0], [0, 1, 0], [0, 0, 0]]
1赞
Robert Haas
8/13/2022
#4
以下是我不使用而是用列表推导式替换它的方法:*
a = [[0 for _ in range(3)] for _ in range(3)]
评论
* 3