以Python方式创建列表的列表
我正在使用列表列表来存储 python 中的矩阵。 我尝试按如下方式初始化 2x3 零矩阵。
mat=[[0]*2]*3
但是,当我更改矩阵中一项的值时,它会更改每行中该条目的值,因为 mat
中每行的 id 是相同。 例如,分配
mat[0][0]=1
mat
后为[[1, 0], [1, 0], [1, 0]]
。
我知道我可以使用循环创建零矩阵,如下所示,
mat=[[0]*2]
for i in range(1,3):
mat.append([0]*2)
但是任何人都可以向我展示一种更Pythonic的方法吗?
I'm using a list of lists to store a matrix in python. I tried to initialise a 2x3 Zero matrix as follows.
mat=[[0]*2]*3
However, when I change the value of one of the items in the matrix, it changes the value of that entry in every row, since the id of each row in mat
is the same. For example, after assigning
mat[0][0]=1
mat
is [[1, 0], [1, 0], [1, 0]]
.
I know I can create the Zero matrix using a loop as follows,
mat=[[0]*2]
for i in range(1,3):
mat.append([0]*2)
but can anyone show me a more pythonic way?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
列表理解:
使用 功能:
Use a list comprehension:
Or, as a function:
试试这个:
在此答案中也讨论了这一点:
Try this:
This is also discussed in this answer:
这比接受的答案更快!
使用 xrange(rows) 而不是 [0]*rows 没有区别。
不使用 itertools 并以相同速度运行的变体
来自 ipython:
This one is faster than the accepted answer!
Using xrange(rows) instead of [0]*rows makes no difference.
A variation that doesn't use itertools and runs around the same speed
From ipython:
我使用的
虽然取决于创建矩阵后对矩阵的处理方式,但您可能会考虑使用 NumPy 数组。
I use
although depending on what you do with the matrix after you create it, you might take a look at using a NumPy array.
这会起作用
This will work
怎么样:
又名列表理解; 来自 文档:
What about:
Aka List comprehension; from the docs:
如果涉及的尺寸确实只有 2 和 3,则
很容易是最好的,但尚未提及。
If the sizes involved are really only 2 and 3,
is easily best and hasn't been mentioned yet.
还有 itertool 不能做的事情吗? :)
Is there anything itertools can't do? :)