如何在python中获取任何大小的空数组?


120

我基本上想在C语言中使用python等效:

int a[x];

但在python中,我声明了一个数组,如:

a = []

问题是我想给随机槽分配值,例如:

a[4] = 1

但由于数组为空,我无法使用python做到这一点。

Answers:


239

如果按“数组”实际上是指Python列表,则可以使用

a = [0] * 10

要么

a = [None] * 10

91
您必须注意的一件事a = [obj] * N是,同一obj出现在数组的每个元素中。如果它是可变obj,并且您修改了一项,则所有内容都会被更改。...但是,对于使用整数(或任何其他不可变类型)的示例,这没有什么区别。或者,如果仅分配给元素,也不是问题。(我提到它是因为我做得太频繁了:))
dappawit

4
这让我在第一个Python项目@dappawit上感到很难受。注意此警告。
Nate

它为对象创建了相同的参考
Amr Alaa

22

您不能完全按照Python的要求进行操作(如果我没看错的话)。您需要为列表的每个元素(或您所说的数组)放入值。

但是,请尝试以下操作:

a = [0 for x in range(N)]  # N = size of list you want
a[i] = 5  # as long as i < N, you're okay

对于其他类型的列表,也可以使用0以外的 None值。


2
此答案有误。range(N)如果Python <3.0,将已经产生一个列表。
2011年

1
是的,它将产生一个列表。如果您担心效率,可以xrange(N)在Python 2.x中使用。我不确定它与不正确的边界如何。我更喜欢这样做,a = range(N)因为每个元素都以合理的“默认”开始。我想这是一个见解的问题。
dappawit 2011年

16

您可以使用numpy:

import numpy as np

来自空数组的示例:

np.empty([2, 2])
array([[ -9.74499359e+001,   6.69583040e-309],
       [  2.13182611e-314,   3.06959433e-309]])  

7

只需声明列表并附加每个元素即可。例如:

a = []
a.append('first item')
a.append('second item')

5
您将如何“分配随机广告位”
Tdelang

5

您也可以使用list的extend方法扩展它。

a= []
a.extend([None]*10)
a.extend([None]*20)

1

如果您(或该问题的其他搜索者)实际上对创建一个用整数填充的连续数组感兴趣,请考虑bytearraymemoryivew

# cast() is available starting Python 3.3
size = 10**6 
ints = memoryview(bytearray(size)).cast('i') 

ints.contiguous, ints.itemsize, ints.shape
# (True, 4, (250000,))

ints[0]
# 0

ints[0] = 16
ints[0]
# 16

1
x=[]
for i in range(0,5):
    x.append(i)
    print(x[i])

2
尽管这段代码可以解决问题,但包括解释如何以及为何解决该问题的说明,确实可以帮助提高您的帖子质量,并可能导致更多的投票。请记住,您将来会为读者回答问题,而不仅仅是现在问的人。请编辑您的答案以添加说明,并指出适用的限制和假设。
Daniil

0

如果您确实想要C样式的数组

import array
a = array.array('i', x * [0])
a[3] = 5
try:
   [5] = 'a'
except TypeError:
   print('integers only allowed')

请注意,python中没有未初始化变量的概念。变量是绑定到值的名称,因此该值必须具有某些内容。在上面的示例中,数组以零初始化。

但是,这在python中并不常见,除非您实际上需要低级的东西。在大多数情况下,如其他答案所示,使用空列表或空numpy数组会更好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.