协慌网

登录 贡献 社区

在 python 中创建具有特定大小的空列表

我想创建一个可以容纳 10 个元素的空列表(或最好的方法)。

之后,我想在该列表中分配值,例如,应该显示 0 到 9:

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

print  s1

但是,当我运行此代码时,它会产生错误,或者在其他情况下,它仅显示[] (空)。

有人可以解释为什么吗?

答案

您不能分配给类似lst[i] = something的列表,除非该列表已经使用至少i+1元素进行了初始化。您需要使用 append 将元素添加到列表的末尾。 lst.append(something)

(如果您使用字典,则可以使用分配符号)。

创建一个空列表:

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

为上述列表中的现有元素分配一个值:

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

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

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

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

使用函数创建列表:

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

列表理解(使用平方,因为对于范围您不需要执行所有这些操作,您只需返回range(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)

甚至更简单,在 Python 2.x 中,您可以执行以下操作以初始化一个值从 0 到 9 的列表:

lst = range(10)

在 Python 3.x 中:

lst = list(range(10))

varunl 当前接受的答案

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

对于非引用类型(例如数字)效果很好。不幸的是,如果您要创建列表列表,则会遇到引用错误。 Python 2.7.6 中的示例:

>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>>

如您所见,每个元素都指向相同的列表对象。为了解决这个问题,您可以创建一个将每个位置初始化为不同对象引用的方法。

def init_list_of_objects(size):
    list_of_objects = list()
    for i in range(0,size):
        list_of_objects.append( list() ) #different object reference each time
    return list_of_objects


>>> a = init_list_of_objects(10)
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [], [], [], [], [], [], [], [], []]
>>>

可能有一种默认的内置 python 方式(而不是编写函数)来执行此操作,但是我不确定它是什么。乐意予以纠正!

编辑: [ [] for _ in range(10)]

例子 :

>>> [ [random.random() for _ in range(2) ] for _ in range(5)]
>>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]]