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

时间:2012-05-23 00:38:25

标签: python list

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

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

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

print  s1

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

有人可以解释原因吗?

16 个答案:

答案 0 :(得分:624)

除非已使用至少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]

答案 1 :(得分:109)

请改为尝试:

lst = [None] * 10

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

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

不可否认,这不是Pythonic做事的方式。更好地做到这一点:

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

或者甚至更好,使用这样的列表推导:

[i for i in range(10)]

答案 2 :(得分:58)

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

答案 3 :(得分:17)

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

答案 4 :(得分:13)

有两个"快速"方法:

x = length_of_your_list
a = [None]*x
# or
a = [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

答案 5 :(得分:9)

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

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

答案 6 :(得分:7)

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

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

答案 7 :(得分:5)

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

  

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

所有列表都可以包含任意数量的元素,但仅限于可用内存的限制。唯一的#34;尺寸"重要的列表是当前中的元素数量。

  

但是当我运行它时,结果是[]

print display s1是无效的语法;根据您对所见内容的描述,我假设您的意思是display(s1),然后是print s1。要运行它,您必须先前已定义全局s1才能传入函数。

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

没有理由在这里传递值。 (也没有真正的理由去创建一个功能,但是除了这一点之外。)你想要"创建"某事,所以这是你的功能的输出。创建您描述的内容无需任何信息,因此请勿传递任何信息。要获取信息,请return

这会给你类似的东西:

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

您将注意到的下一个问题是您的列表实际上只有9个元素,因为range函数会跳过结束点。 (正面注释,[]list()一样,分号是不必要的,s1是变量的不良名称,{{1}只需要一个参数如果您从range开始。)那么您最终会以

开头
0

然而,这仍然是标记; def create_list(): result = list() for i in range(10): result[i] = i return result 并不像rangefor那样是语言的一部分,而是一种功能。并猜猜该函数返回什么?那是对的 - 这些整数的列表。所以整个函数都崩溃了

def

现在你明白为什么我们根本不需要自己写一个功能; def create_list(): return range(10) 已经是我们正在寻找的功能。虽然,再次,没有必要或理由"预先规模"清单。

答案 8 :(得分:2)

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

list(range(9))

答案 9 :(得分:1)

这是我在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('')

答案 10 :(得分:1)

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

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

答案 11 :(得分:0)

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

from collections import deque
my_deque_size_10 = deque(maxlen=10)

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

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

如果你需要一个列表,那么在满时使用 list(deque object)

答案 12 :(得分:-1)

我在搜索类似问题时遇到了这个问题。我必须构建一个2D数组,然后用dict中的元素替换每个列表的某些元素(在2D数组中)。 然后我遇到this这个问题对我有帮助,也许这会帮助其他初学者到处走走。 关键技巧是将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循环。希望这有助于其他遇到这篇文章的人。

答案 13 :(得分:-1)

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

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

答案 14 :(得分:-1)

使其更易于重用。

files = {"file": ('b839', open('/home/user/b839.jpeg', 'rb'), 'multipart/form-data')}
resp = requests.post('http://localhost:8000/api/upload/', files=files)

答案 15 :(得分:-2)

Activity

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

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