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

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

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

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


编者按:

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


当前回答

我很惊讶没有人建议这种创建空列表的简单方法。这是一个旧线程,但为了完整起见,只需添加此线程。这将创建一个包含10个空列表的列表

x = [[] for i in range(10)]

其他回答

另一个选项是对固定大小的数组(指针)使用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)
s1 = []
for i in range(11):
   s1.append(i)

print s1

要创建列表,只需使用以下括号:“[]”

要向列表中添加内容,请使用list.append()

除非列表已经用至少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]

请尝试以下操作:

lst = [None] * 10

上面将创建一个大小为10的列表,其中每个位置都初始化为None。之后,可以向其中添加元素:

lst = [None] * 10
for i in range(10):
    lst[i] = i

诚然,这并不是Python式的做事方式。最好这样做:

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

或者更简单的是,在Python2.x中,您可以这样做,用0到9的值初始化列表:

lst = range(10)

在Python 3.x中:

lst = list(range(10))

如何创建可容纳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