如何在Python中得到一个任意大小的空列表?

153

我基本上想要一个 Python 版本的这个 C 数组:

int a[x];

但在Python中,我像这样声明数组:

a = []

问题是我想分配随机槽位并赋予像以下这样的值:

a[4] = 1

但是使用Python无法这样做,因为Python列表为空(长度为0)。

10个回答

299

如果你指的是 Python 列表而非“数组”,你可以使用

a = [0] * 10
或者
a = [None] * 10

117
使用 a = [obj] * N 的时候需要注意,数组中每个元素都是同一个对象。如果这个对象可变,并且你修改了其中一个元素,所有元素都会被改变。但是,对于这个例子使用整数(或其他不可变类型)来说并没有影响。或者,如果你只是给元素赋值而不修改它们,那么也不是问题。(我提到这点是因为我经常犯这个错误 :)) - dappawit
5
在我的第一个Python项目中,那个问题给我带来了很大的麻烦。请注意这个警告。 - The Nate
它为对象创建相同的引用。 - Amr Alaa

28

如果我理解得正确,你不能在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
这个答案有点不正确。如果Python < 3.0,range(N)将已经生成一个列表。 - Apalala
1
如果为True,它将生成一个列表。如果您担心效率问题,可以在Python 2.x中使用xrange(N)。但我不确定它是否有些不正确。与a = range(N)相比,我更喜欢它,因为每个元素都以合理的“默认值”开始。我想这是一个观点问题。 - dappawit

22

您可以使用numpy:

import numpy as np

来自空数组的示例:

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

np.empty并不会创建一个真正的“空”数组——所有种类的奇怪数据都会在其中,就像示例所展示的那样。如果你想要一个数值数组,请使用np.zeros - Roly

7
你还可以使用列表的extend方法进行扩展。
a= []
a.extend([None]*10)
a.extend([None]*20)

5

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

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

9
那么您要如何“分配随机时间段”? - Tdelang
这个应该至少在一个循环中模拟填满整个列表,就像这个答案所做的那样... - Tomerikoo

3

如果您(或其他搜索该问题的人)真正想要创建一个连续的数组来填充整数,请考虑使用bytearraymemoryview

# 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

2

还可以创建指定大小的空数组:

array = [[] for _ in range(n)] # n equal to your desired size
array[0].append(5) # it appends 5 to an empty list, then array[0] is [5]

如果您将其定义为array = [] * n,那么如果您修改一个项目,则所有项目都会以相同的方式进行更改,因为它是可变的。

1
虽然这是正确的,并且有一个很好的解释,但似乎并没有要求一个二维数组,而这正是你的代码所产生的... - Tomerikoo
@Tomerikoo 你是对的,我误解了。 - armiro

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

2
虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - user12867493

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 数组,就像其他答案建议的那样。

为了避免对“未初始化”的可能误解:numpy命令np.empty(size)返回给定大小的非初始化数组。这里的“未初始化”意味着条目(数组中的值)是完全随机的,通常是垃圾,结果是先前在新分配的内存中的内容。因此,是的,被视为指向内存的变量已初始化,但存储在其中的值即其中的值并没有初始化--一些作者确实将这种情况称为“未初始化变量”,特别是在C语言中,你很可能会这样做。 - Max

0

分配“随机插槽”的(我认为唯一)方法是使用字典,例如:

 a = {}     # initialize empty dictionary
 a[4] = 1   # define the entry for index 4 to be equal to 1
 a['French','red'] = 'rouge'  # the entry for index (French,red) is "rouge".

这对于“快速hack”非常方便,如果您对数组元素的访问不是很频繁,那么查询开销就无关紧要了。否则,最好使用预分配的(例如numpy)固定大小的数组进行操作,可以通过a = np.empty(10)(用于长度为10的未初始化向量)或a = np.zeros([5,5])(用于 用零初始化的5x5矩阵)来创建。

备注:在您的C示例中,在分配(您的int a[x];)之前,您还必须分配数组以便指定(不太)“随机的槽位”(即0到x-1之间的整数索引)。

参考文献:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接