没有循环的Python多维数组初始化

时间:2010-09-07 20:30:40

标签: python

Python中有没有办法在不使用循环的情况下初始化多维数组/列表?

12 个答案:

答案 0 :(得分:13)

当然的一种方式

arr = eval(`[[0]*5]*10`)

arr = eval(("[[0]*5]+"*10)[:-1])

但它太可怕了,所以每个人都使用循环(通常是列表理解)或者是numpy

答案 1 :(得分:9)

根据您的实际需求,事实上的“标准”套餐Numpy可能会为您提供您所需要的。

您可以使用

创建一个多维数组
numpy.empty((10, 4, 100))  # 3D array

(使用任意值初始化)或使用

创建与相同的数组

numpy.zeros((10, 4, 100))

Numpy非常快,适用于阵列操作。

答案 2 :(得分:7)

当然,你可以做到

mylist = [
            [1,2,3],
            [4,5,6],
            [7,8,9]
         ]

答案 3 :(得分:4)

以下内容不使用任何特殊库,也不使用eval:

arr = [[0]*5 for x in range(6)]

并且它不会创建重复的引用:

>>> arr[1][1] = 2
>>> arr
[[0, 0, 0, 0, 0],
 [0, 2, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0]]

答案 4 :(得分:3)

我不相信这是可能的。

您可以这样做:

>>> a = [[0] * 5] * 5

创建一个5x5矩阵,但它是重复的对象(你不想要的)。例如:

>>> a[1][2] = 1
[[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0]]

你几乎肯定需要使用某种循环,如:

[[0 for y in range(5)] for x in range(5)]

答案 5 :(得分:3)

递归是你的朋友:D

这是一个非常天真的实现,但它确实有效!

dim = [2, 2, 2]

def get_array(level, dimension):
    if( level != len(dimension) ):
        return [get_array(level+1, dimension) for i in range(dimension[level])]
    else:
        return 0

print get_array(0, dim)

答案 6 :(得分:2)

这取决于你将数组初始化的内容,但肯定。您可以使用列表推导来创建一个5×3数组,例如:

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

>>> [[3*y+x for x in range(3)] for y in range(5)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14]]

是的,我想这仍然有循环 - 但这一切都在一行中完成,我认为这是你问题的预期含义?

答案 7 :(得分:2)

a = [[]]
a.append([1,2])
a.append([2,3])

然后

>>> a
[[1, 2], [2, 3]]

答案 8 :(得分:1)

如果你正在使用Numpy做数值工作,比如

x = numpy.zeros ((m,n))
x = numpy.ones ((m,n))

答案 9 :(得分:1)

Python没有数组。它有其他序列类型,从列表到字典,不会忘记集合 - 正确的序列类型取决于您的特定需求。

假设您的“数组”实际上是一个列表,“初始化”意味着分配 NxM 元素的列表列表,您可以(伪代码):

  • N次:M次:添加元素
  • N次:添加一行M元素
  • 写出全部内容

你说你不想循环,排除前两点,但为什么呢? 你也说你不想把事情写下来(回应雅各布),你怎么会这样做呢?我不知道有任何其他方式来获取数据结构,而无需在任何编程语言中以较小的部分(循环)或明确地将其写下来。

另外请记住,初始化但空的列表并不比没有列表更好,除非您将数据放入其中。而且在放入数据之前你不需要初始化它......

如果这不是理论上的练习,你可能会提出错误的问题。我建议您解释一下该数组需要做什么。

答案 10 :(得分:0)

您可以通过这种方式进行:

首先不使用任何循环:

[[0] * n] * m

第二次使用简单的内联列表理解:

[[0 for column in range(n)] for row in range(m)]

答案 11 :(得分:-2)

您可以使用N维数组(ndarray)。这是文档的链接。 http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html