【问题标题】:Python multiple dimension arrays [duplicate]Python多维数组[重复]
【发布时间】:2012-10-29 07:09:16
【问题描述】:

可能重复:
How to initialize a two-dimensional array in Python?

在解决一个关于二维数组的简单问题时,我在这个网站上遇到了一个解决方案,它解释了如何使用重载运算符在 Python 中声明一个。

例子:

Myarray = [[0]*3]*3

这将产生以下数组(列表)

[[0,0,0],[0,0,0],[0,0,0]]

在您使用它之前,这似乎很好:

如果你分配一个元素,例如:

Myarray [0][0] = 1

你得到了意想不到的输出:

[[1,0, 0],[1,0,0] , [1,0,0]]

实际上同时分配 Myarray[1][0] 和 Myarray[2][0]

我的解决方案:

Myarray = [[][][]]
for i in range(0,3):
  for j in range (0,3):
     Myarray[i].append(0)

此解决方案按预期工作:

Marray[0][1] = 1

给你

[[1,0, 0],[0,0,0] , [0,0,0]]

有没有更简单的方法可以做到这一点?这是剑桥 A 级问题的解决方案,与其他语言相比,对于学生来说似乎过于冗长。

【问题讨论】:

  • 当您执行Myarray = [[0]*3]*3 时,实际上是在乘以引用。列表理解是一种单行方式。
  • 用其他语言会短多少?
  • 我喜欢 [x[:] for x in [[0]*3]*3] 用于非 numpy 二维数组,但我在那个方面是少数。
  • @ScottHunter:有一些类似 Python 的语言只是[[0]*3]*3,因为它们没有正确地引用。当然留在 Python 中,假设你已经完成了from numpy import *zeros((3,3)) 实际上更短,也更好。

标签: python


【解决方案1】:

使用普通 Python,您可以使用它,一个嵌套列表理解

>>> m = [[0 for y in range(3)] for x in range(3)]
>>> m
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

与您在示例中显示的相乘列表不同,它具有所需的行为

>>> m[1][0] = 99
>>> m
[[0, 0, 0], [99, 0, 0], [0, 0, 0]]

但是,如果要认真使用多维数组和/或数值编程,我建议您使用 Numpy 数组。

【讨论】:

  • 更好的是:[[0]*3 for x in range(3)]
  • 上述答案和 Scotts 都可以正常工作,我感谢你们俩。出于 A 级 Junuxx 的目的,它更具可读性,因此请投票!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2011-02-18
  • 2012-09-16
  • 2018-04-03
相关资源
最近更新 更多