如何在 Python 中获取任意大小的空列表?

Posted

技术标签:

【中文标题】如何在 Python 中获取任意大小的空列表?【英文标题】:How do I get an empty list of any size in Python? 【发布时间】:2011-07-09 12:00:40 【问题描述】:

我基本上想要一个在 C 中与这个数组等效的 Python:

int a[x];

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

a = []

问题是我想为随机插槽分配如下值:

a[4] = 1

但我不能用 Python 做到这一点,因为 Python 列表是空的(长度为 0)。

【问题讨论】:

【参考方案1】:

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

a = [0] * 10

a = [None] * 10

【讨论】:

a = [obj] * N 需要注意的一件事是,相同的 obj 出现在数组的每个元素中。如果它是一个可变的 obj,并且您修改了一项,则所有内容都将被更改。 ...但是,对于这个使用整数(或任何其他不可变类型)的示例,它没有区别。或者,如果您只是分配给元素,那也不是问题。 (我提到它是因为我经常这样做:)) 在我的第一个 Python 项目@dappawit 中,这让我很难。注意这个警告。 它为对象创建相同的引用【参考方案2】:

你不能在 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 通常也是一个不错的选择。

【讨论】:

这个答案不正确。如果 Python ,range(N) 将已经生成一个列表 没错,它会产生一个列表。如果您担心效率,可以在 Python 2.x 中使用xrange(N)。但是,我不确定它是如何接近不正确的。我更喜欢它而不是a = range(N),因为每个元素都以合理的“默认”开始。我想这是一个见仁见智的问题。【参考方案3】:

你可以使用 numpy:

import numpy as np

来自Empty Array的示例:

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

【讨论】:

np.empty 实际上并没有创建一个“空”数组——各种奇怪的数据都会在那里,如示例所示。如果它是一个数字数组,你想使用np.zeros【参考方案4】:

您也可以使用列表的扩展方法对其进行扩展。

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

你会如何'分配随机插槽' 这至少应该在一个循环中模拟填充整个列表,就像this answer 那样...【参考方案6】:

如果您(或此问题的其他搜索者)实际上有兴趣创建一个连续数组来填充整数,请考虑 bytearray 和 memoryivew:

# 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

【讨论】:

【参考方案7】:
x=[]
for i in range(0,5):
    x.append(i)
    print(x[i])

【讨论】:

虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案添加解释并说明适用的限制和假设。【参考方案8】:

也可以创建一个一定大小的空数组:

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,那么如果您修改一个项目,所有项目都会以相同的方式更改,因为它具有可变性。

【讨论】:

虽然这是真的,并且有一个很好的解释,但似乎没有询问二维数组,这是您的代码产生的...... @Tomerikoo 你说得对,我的误会。【参考方案9】:

如果你真的想要一个 C 风格的数组

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

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

然而,这在 python 中并不常见,除非你真的需要它来处理低级的东西。在大多数情况下,您最好使用空列表或空 numpy 数组,正如其他答案所建议的那样。

【讨论】:

只是为了避免对“未初始化”的可能误解:numpy 命令np.empty(size) 确实返回给定大小的未初始化数组。这里“未初始化”意味着条目(数组中的值)是完全随机的并且通常是垃圾,这是由新分配的内存中较早的内容引起的。所以是的,被认为是指向内存的指针的 variable 被初始化了,但是存储在“其中”的值,即那里,没有——一些作者确实将这种情况称为“未初始化的变量”,尤其是在 C 语言中,您很可能会这样做。【参考方案10】:

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

 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".

这对于“快速破解”很方便,如果您没有对数组元素的密集访问权限,则查找开销是无关紧要的。 否则,使用固定大小的预分配(例如,numpy)数组会更有效,您可以使用 a = np.empty(10)(对于长度为 10 的未初始化向量)或 a = np.zeros([5,5]) 创建 5x5 矩阵用零初始化)。

备注:在您的 C 示例中,您还必须在分配(不是这样)“随机槽”(即 0 和 x-1 之间的整数索引)之前分配数组(您的 int a[x];)。

参考资料:

dict 数据类型:https://docs.python.org/3/library/stdtypes.html#mapping-types-dict 函数 np.empty():https://numpy.org/doc/stable/reference/generated/numpy.empty.html

【讨论】:

以上是关于如何在 Python 中获取任意大小的空列表?的主要内容,如果未能解决你的问题,请参考以下文章

python如何二删除二维或者三维数组/列表中某维的空元素

python - 如何使用列表中的键和Python中的空值初始化dict?

Python 2.7,如何获取/检查列表的大小? [复制]

如何在不定义任何限制的情况下在 python 中获取任意数量的输入?

如何在 Swift 中获取任意数组的字节大小?

在 Python 中处理时,如何确保在短路点之后不会急切地评估任意函数调用列表?