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

Create an empty list in python with certain size

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

之后,我要在该列表中指定值,例如,应该显示0到9:

1
2
3
4
5
s1 = list();
for i in range(0,9):
   s1[i] = i

print  s1

但是当我运行这段代码时,它会生成一个错误,或者在另一种情况下,它只显示[](空)。

有人能解释为什么吗?


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

(如果使用字典,可以使用赋值符号)。

创建空列表:

1
2
3
>>> l = [None] * 10
>>> l
[None, None, None, None, None, None, None, None, None, None]

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

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

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

范围(X)从[0,1,2,…]创建一个列表。X-1

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

使用函数创建列表:

1
2
3
4
5
6
7
8
>>> 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)):

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


试试这个:

1
lst = [None] * 10

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

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

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

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

或者更好,使用如下列表理解:

1
[i for i in range(10)]


varunl当前接受的答案

1
2
3
 >>> l = [None] * 10
 >>> l
 [None, None, None, None, None, None, None, None, None, None]

适用于数字等非引用类型。不幸的是,如果要创建列表列表,则会遇到引用错误。python 2.7.6中的示例:

1
2
3
4
5
6
7
>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)]

例子:

1
2
>>> [ [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]]


您可以在列表中输入.append(element),例如:s1.append(i)。您当前要做的是访问一个不存在的元素(s1[i])。


有两种"快速"方法:

1
2
3
4
x = length_of_your_list
a = [None]*x
# or
a = [None for _ in xrange(x)]

似乎[None]*x更快:

1
2
3
4
5
>>> 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)可能是最快的:

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

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

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


(这是根据问题的原始版本编写的。)

I want to create a empty list (or whatever is the best way) can hold 10 elements.

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

but when I run it, the result is []

print display s1不是有效的语法;根据您对所看到的内容的描述,我假设您是指display(s1),然后是print s1。要运行该函数,必须先定义一个全局s1以传递给函数。

调用display不会修改您输入的列表。您的代码说"s1"是传递给函数的任何东西的名称;好的,现在我们要做的第一件事就是完全忘记这个东西,让s1开始引用新创建的list。现在我们将修改那个list。这对您传入的值没有影响。

这里没有理由传入值。(也没有真正的理由去创建一个函数,但这也不重要。)你想要"创建"一些东西,所以这就是你的函数的输出。创建所描述的内容不需要任何信息,因此不要在中传递任何信息。为了得到信息,returnit.

这会给你带来如下好处:

1
2
3
4
5
def display():
    s1 = list();
    for i in range(0, 9):
        s1[i] = i
    return s1

您将注意到的下一个问题是,您的列表实际上只有9个元素,因为端点被range函数跳过。(旁注,[]list()一样工作,分号是不必要的,s1是变量的一个不好的名称,如果从0开始,range只需要一个参数),那么最后得到的结果是

1
2
3
4
5
def create_list():
    result = list()
    for i in range(10):
        result[i] = i
    return result

然而,这仍然缺少标记;range不是某种神奇的关键字,它是语言的一部分,就像fordef一样,但它是一个函数。猜猜这个函数返回了什么?是的-一个整数列表。所以整个函数折叠为

1
2
def create_list():
    return range(10)

现在你明白了为什么我们根本不需要自己编写函数;range已经是我们要寻找的函数了。尽管如此,也没有必要或理由"预先调整"列表的大小。


我有点惊讶,创建初始化列表的最简单方法不在这些答案中。只需在list功能中使用发电机:

1
list(range(9))

下面是我在python中的2d列表代码,它将从输入中读取行数:

1
2
3
4
5
6
7
8
9
10
11
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('')

使用嵌套列表理解创建大小为n的二维矩阵的一种简单方法:

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

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

1
2
3
4
5
6
7
8
9
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


此代码生成一个包含10个随机数的数组。

1
2
3
4
5
6
7
import random
numrand=[]
for i in range(0,10):
   a = random.randint(1,50)
   numrand.append(a)
   print(a,i)
print(numrand)


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

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

1
2
3
4
5
6
7
8
9
10
11
12
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循环。希望这能帮助其他遇到这个职位的人。


1
2
3
4
5
s1 = []
for i in range(11):
   s1.append(i)

print s1

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

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