如何创建可容纳10个元素的空列表?

之后,我想在该列表中分配值。例如:

xs = list()
for i in range(0, 9):
   xs[i] = i

但是,这会导致IndexError:list赋值索引超出范围。为什么?


编者按:

在Python中,列表没有设置容量,但无法分配给尚未存在的元素。这里的答案显示了创建一个列表的代码,其中包含10个稍后要替换的“伪”元素。然而,遇到这个问题的大多数初学者实际上只是想通过向列表中添加元素来构建列表。这应该使用.append方法来完成,尽管通常会有特定于问题的方法来更直接地创建列表。请参阅为什么此迭代列表增长代码会导致IndexError:列表分配索引超出范围?如何重复向列表中添加元素?详细信息。


当前回答

您可以将(元素)追加到列表中,例如:

s1.append(i)

您当前试图做的是访问不存在的元素(s1[i])。

其他回答

您可以将(元素)追加到列表中,例如:

s1.append(i)

您当前试图做的是访问不存在的元素(s1[i])。

另一个选项是对固定大小的数组(指针)使用numpy:

>pip安装数

import numpy as np


a = np.empty(10, dtype=np.object)
a[1] = 2
a[5] = "john"
a[3] = []

如果你只想要数字,你可以使用numpy:

a = np.arange(10)

除非列表已经用至少i+1个元素初始化,否则不能向xs[i]=value这样的列表赋值。相反,使用xs.append(value)将元素添加到列表末尾。(虽然如果使用字典而不是列表,则可以使用赋值符号。)

创建空列表:

>>> xs = [None] * 10
>>> xs
[None, None, None, None, None, None, None, None, None, None]

为上述列表的现有元素赋值:

>>> xs[1] = 5
>>> xs
[None, 5, None, None, None, None, None, None, None, None]

请记住,像xs[15]=5这样的东西仍然会失败,因为我们的列表只有10个元素。

range(x)从[0,1,2,…x-1]创建列表

# 2.X only. Use list(range(10)) in 3.X.
>>> xs = range(10)
>>> xs
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

使用函数创建列表:

>>> def display():
...     xs = []
...     for i in range(9): # This is just to tell you how to create a list.
...         xs.append(i)
...     return xs
... 
>>> print display()
[0, 1, 2, 3, 4, 5, 6, 7, 8]

列表理解(使用正方形,因为对于范围,您不需要执行所有这些操作,只需返回范围(0,9)):

>>> def display():
...     return [x**2 for x in range(9)]
... 
>>> print display()
[0, 1, 4, 9, 16, 25, 36, 49, 64]

我在寻找类似问题时遇到了这个SO问题。我必须构建一个2D数组,然后用dict中的元素替换每个列表中的一些元素(在2D数组中)。然后我遇到了这个SO问题,这对我很有帮助,也许这会帮助其他初学者。关键技巧是将2D数组初始化为numpy数组,然后使用array[i,j]而不是array[i][j]。

作为参考,这是我必须使用的一段代码:

nd_array = []
for i in range(30):
    nd_array.append(np.zeros(shape = (32,1)))
new_array = []
for i in range(len(lines)):
    new_array.append(nd_array)
new_array = np.asarray(new_array)
for i in range(len(lines)):
    splits = lines[i].split(' ')
    for j in range(len(splits)):
        #print(new_array[i][j])
        new_array[i,j] = final_embeddings[dictionary[str(splits[j])]-1].reshape(32,1)

现在我知道我们可以使用列表理解,但为了简单起见,我使用了嵌套的for循环。希望这能帮助其他看到这篇文章的人。

如何创建可容纳10个元素的空列表?

所有列表都可以容纳任意数量的元素,只受可用内存的限制。列表中唯一重要的“大小”是其中当前元素的数量。

但是,这会导致IndexError:list赋值索引超出范围。为什么?

第一次通过循环时,i等于0。因此,我们尝试xs[0]=0。这不起作用,因为列表中当前有0个元素,因此0不是有效的索引。

我们不能使用索引来写入不存在的列表元素——我们只能覆盖现有的元素。相反,我们应该使用.append方法:

xs = list();
for i in range(0, 9):
   xs.append(i)

您将注意到的下一个问题是,列表实际上只有9个元素,因为范围函数跳过了终点。(正如旁注:[]与list()一样有效,分号是不必要的,如果从0开始,范围只需要一个参数。)解决这些问题可以:

xs = []
for i in range(10):
    xs.append(i)

然而,这仍然缺少标记-range并不是某种神奇的关键字,它是语言的一部分,例如def。

在2.x中,range是一个函数,它直接返回我们已经想要的列表:

xs = range(10) # 2.x specific!
# In 3.x, we don't get a list; we can do a lot of things with the
# result, but we can't e.g. append or replace elements.

在3.x中,range是一个设计巧妙的类,range(10)创建了一个实例。为了获得所需的列表,我们可以简单地将其输入到列表构造函数:

xs = list(range(10)) # correct in 3.x, redundant in 2.x