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

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

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

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

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

有人能解释为什么吗?

你不能像lst[i] = something分配一个列表。 你需要使用append。 lst.append(something)

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

创build一个空列表:

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

范围(x)从[0,1,2,… x-1]创build一个列表

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

使用一个函数来创build一个列表:

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

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

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

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

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

甚至更好 ,使用这样的列表parsing:

 [i for i in range(10)] 

varunl目前接受的答案

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

适用于数字等非参考types。 不幸的是,如果你想创build一个列表清单,你会遇到引用错误。 Python 2.7.6中的例子:

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

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

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

你可以.append(element)到列表中,例如: s1.append(i) 。 你目前正在试图做的是访问一个不存在的元素( s1[i] )。

有两个“快速”方法:

 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 

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

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

所有列表都可以容纳尽可能多的元素,只受可用内存的限制。 重要列表中唯一的“大小”是当前在其中的元素的数量。

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

print display s1是无效的语法; 根据你所看到的描述,我假定你的意思是display(s1)然后print s1 。 为了运行,你必须事先定义一个全局的s1传递给函数。

调用display不会修改您传入的列表,如书面所示。 你的代码说:“ s1是传递给函数的任何东西的名字;好的,现在我们要做的第一件事就是完全忘记这个东西,让s1开始引用新创build的list 。将修改该list “。 这对您传入的值没有影响。

没有理由在这里传递一个价值。 (创build一个函数也没有真正的理由,但是这不是重点。)你想要“创build”一些东西,所以这是你的函数的输出。 不需要任何信息来创build您所描述的内容,因此不要传递任何信息。要获取信息,请将其return

这会给你像这样的东西:

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

下一个你会注意到的问题是你的列表实际上只有9个元素,因为range函数会跳过结束点。 (正如旁注, []list()一样好,分号是不必要的, s1是variables的一个不好名字,如果你从0开始,那么只有一个参数对于range是需要的。)那么你以结束

 def create_list(): result = list() for i in range(10): result[i] = i return result 

但是,这仍然是缺失的标志; range不是一些神奇的关键字,这是语言的一部分,是defdef方式,而是一种function。 猜猜那个函数返回什么? 这是正确的 – 这些整数的列表。 所以整个function崩溃了

 def create_list(): return range(10) 

现在你明白了为什么我们根本不需要自己编写一个函数; range已经是我们正在寻找的function。 虽然,再次,没有必要或没有理由“预先”的名单。