在Python中创建具有一定大小的空列表

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

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

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

然而,这给出了IndexError: list assignment index out of range。为什么?


编者注:

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

2029632 次浏览

您可以将.append(element)添加到列表中,例如:

s1.append(i)

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

试试这个:

lst = [None] * 10

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

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

不可否认,这不是Pythonic的做事方式。最好这样做:

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

或者更简单,在Python 2. x中,您可以这样做来初始化一个值从0到9的列表:

lst = range(10)

在Python 3. x中:

lst = list(range(10))

你不能赋值给像xs[i] = value这样的列表,除非列表已经初始化了至少i+1个元素。相反,使用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]

列表理解(使用正方形,因为对于范围,你不需要做所有这些,你可以只返回range(0,9)):

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

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

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

然而,这给出了IndexError: list assignment index out of range。为什么?

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

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

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

你会注意到的下一个问题是,你的列表实际上只有9个元素,因为终端被range函数跳过。(作为旁注:[]list()一样工作,分号是不必要的,如果你从0开始,range只需要一个参数。

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

然而,这仍然缺少标记-range不是像for(或者说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)创建了一个实例。要获得所需的列表,我们可以简单地将其提供给list构造函数:

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

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 timereturn 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]]

有两种“快速”方法:

x = length_of_your_lista = [None]*x# ora = [None for _ in xrange(x)]

[None]*x似乎更快:

>>> from timeit import timeit>>> timeit("[None]*100",number=10000)0.023542165756225586>>> timeit("[None for _ in xrange(100)]",number=10000)0.07616496086120605

但是如果你可以接受一个范围(例如[0,1,2,3,...,x-1]),那么range(x)可能是最快的:

>>> timeit("range(100)",number=10000)0.012513160705566406

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

x = [[] for i in range(10)]
s1 = []for i in range(11):s1.append(i)
print s1

要创建一个列表,只需使用这些括号:“[]”

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

这是我在python中用于2D列表的代码,它将从输入中读取行数:

empty = []row = int(input())
for i in range(row):temp = list(map(int, input().split()))empty.append(temp)
for i in empty:for j in i:print(j, end=' ')print('')

我在搜索类似问题时遇到了这个SO问题。我必须构建一个2D数组,然后将每个列表的一些元素(在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个随机数的数组。

import randomnumrand=[]for i in range(0,10):a = random.randint(1,50)numrand.append(a)print(a,i)print(numrand)

使其作为函数更具可重用性。

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

我有点惊讶的是,创建初始化列表的最简单方法不在这些答案中。只需在list函数中使用生成器:

list(range(9))

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

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

接受的答案有一些陷阱。例如:

>>> 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}, {}, {}]>>>

从技术上讲不是一个列表,但在功能方面类似于列表,它是一个固定的长度

from collections import dequemy_deque_size_10 = deque(maxlen=10)

如果它已满,即有10个项目,然后添加另一个项目会导致项目@index 0被丢弃。FIFO…但您也可以在任一方向追加。用于say

  • 统计数据的滚动平均值
  • 通过管道传递列表,也就是在列表上滑动窗口,直到您获得与另一个双端队列对象的匹配。

如果你需要一个列表,那么当满时只需使用列表(双端对象)

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

> pip install numpy

import numpy as np

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

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

a = np.arange(10)

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

  1. 插入:list.insert(indexPosition, value)
  2. 追加:list.append(value)
  3. 扩展:list.extend(value)

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

你可以试试这个:

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

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

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