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

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

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

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


编者按:

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


当前回答

列表始终是“可迭代的”,您可以始终向其中添加新元素:

insert:list.insert(indexPosition,value)append:list.append(值)扩展:列表扩展(值)

在您的例子中,您实例化了一个长度为0的空列表。因此,当您尝试使用列表索引(i)向列表中添加任何值时,它指的是不存在的位置。因此,您得到了错误“IndexError:list赋值索引超出范围”。

您可以改为尝试:

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

print (s1)

要创建一个大小为10的列表(比方说),可以先创建一个空数组,比如np.empty(10),然后使用arrayName.tolist()将其转换为列表。或者,也可以将它们链接起来。

            **`np.empty(10).tolist()`**

其他回答

公认的答案有一些陷阱。例如:

>>> a = [{}] * 3
>>> a
[{}, {}, {}]
>>> a[0]['hello'] = 5
>>> a
[{'hello': 5}, {'hello': 5}, {'hello': 5}]
>>> 

因此,每个字典都引用同一个对象。如果使用数组或对象进行初始化,则同样适用。

你可以这样做:

>>> b = [{} for i in range(0, 3)]
>>> b
[{}, {}, {}]
>>> b[0]['hello'] = 6
>>> b
[{'hello': 6}, {}, {}]
>>> 

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方式(而不是编写函数),但我不确定它是什么。很高兴得到更正!

编辑:范围(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]]

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

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

使其作为一个函数更加可重用。

def createEmptyList(length,fill=None):
    '''
    return a (empty) list of a given length
    Example:
        print createEmptyList(3,-1)
        >> [-1, -1, -1]
        print createEmptyList(4)
        >> [None, None, None, None]
    '''
    return [fill] * length

使用嵌套列表综合创建大小为n的2D矩阵的一种简单方法:

m = [[None for _ in range(n)] for _ in range(n)]