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

Ron*_*ing 465 python list

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

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

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

print  s1
Run Code Online (Sandbox Code Playgroud)

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

有人可以解释原因吗?

var*_*unl 714

lst[i] = something除非已使用至少i+1元素初始化列表,否则无法将列表分配给列表.您需要使用append将元素添加到列表的末尾.lst.append(something).

(如果使用字典,可以使用赋值表示法).

创建一个空列表:

>>> l = [None] * 10
>>> l
[None, None, None, None, None, None, None, None, None, None]
Run Code Online (Sandbox Code Playgroud)

将值分配给上面列表的现有元素:

>>> l[1] = 5
>>> l
[None, 5, None, None, None, None, None, None, None, None]
Run Code Online (Sandbox Code Playgroud)

请记住,类似的东西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]
Run Code Online (Sandbox Code Playgroud)

使用函数创建列表:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你是什​​么意思"你不能指定像lst [i] =某些东西的列表 - 当然你可以!你不能做的是分配超出当前列表长度的不存在的元素 (17认同)
  • **注意** 这会创建一个*指针*列表。对任何非原始对象执行此操作都会创建一个*指向同一对象*的指针列表。这意味着如果您用其他内容替换 None ,您应该知道自己在做什么。 (13认同)
  • “除非列表已经用至少i + 1个元素初始化” ... (3认同)
  • 你可以这样做:`a = [0 for _ in range(10)]` (3认同)

Ósc*_*pez 114

试试这个:

lst = [None] * 10
Run Code Online (Sandbox Code Playgroud)

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

lst = [None] * 10
for i in range(10):
    lst[i] = i
Run Code Online (Sandbox Code Playgroud)

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

lst = []
for i in range(10):
    lst.append(i)
Run Code Online (Sandbox Code Playgroud)

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

[i for i in range(10)]
Run Code Online (Sandbox Code Playgroud)

  • 另一个很棒的事情是你可以使用默认值初始化列表.`lst = ['']*10`或`lst = [0]*10` (2认同)
  • 理解例子的变体.如果数组中的所有元素在初始化时都需要为空,请使用:`arr = [范围(10)中的_为无效]. (2认同)

Jam*_* L. 69

varunl目前接受的答案

 >>> l = [None] * 10
 >>> l
 [None, None, None, None, None, None, None, None, None, None]
Run Code Online (Sandbox Code Playgroud)

适用于非引用类型,如数字.不幸的是,如果你想创建一个列表列表,你将遇到引用错误.Python 2.7.6中的示例:

>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>> 
Run Code Online (Sandbox Code Playgroud)

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

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], [], [], [], [], [], [], [], [], []]
>>> 
Run Code Online (Sandbox Code Playgroud)

有一种默认的内置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]]
Run Code Online (Sandbox Code Playgroud)

  • 我听说使用'append`经常不如列表推导.您可以通过`[[] for _ in range(10)]`创建列表列表. (18认同)
  • Upvoted是因为我生气,因为我有多维数组,相同的数据重复了几次,并且在最终找到这个答案之前无法确定发生了什么.^^我不明白为什么它在这里如此之低. (7认同)

Moh*_*ain 17

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


mgo*_*ser 14

有两种"快速"方法:

x = length_of_your_list
a = [None]*x
# or
a = [None for _ in xrange(x)]
Run Code Online (Sandbox Code Playgroud)

它似乎[None]*x更快:

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

但是如果你对范围(例如[0,1,2,3,...,x-1])没问题,那么range(x)可能是最快的:

>>> timeit("range(100)",number=10000)
0.012513160705566406
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在 Python3 中,您必须使用“list(range(n))”,因为“range()”不返回列表,而是一个迭代器,并且这并不比“[None] *”快。 n`。 (2认同)

use*_*706 14

接受的答案有一些问题。例如:

>>> a = [{}] * 3
>>> a
[{}, {}, {}]
>>> a[0]['hello'] = 5
>>> a
[{'hello': 5}, {'hello': 5}, {'hello': 5}]
>>> 
Run Code Online (Sandbox Code Playgroud)

所以每个字典都指向同一个对象。如果您使用数组或对象进行初始化,情况也是如此。

你可以这样做:

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


Bow*_*Bow 8

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

x = [[] for i in range(10)]
Run Code Online (Sandbox Code Playgroud)

  • 执行上述操作与执行`x = [[]] * 10`之间最重要的区别在于,在后者中,**列表中的每个元素都指向SAME列表对象**。因此,除非您只是想要同一个对象的10个副本,否则请使用基于范围的变体,因为它会创建10个“新”对象。我发现这种区别非常重要。 (5认同)

Igo*_*uez 6

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

list(range(9))
Run Code Online (Sandbox Code Playgroud)

  • 这个问题是这个答案不会根据问题创建一个空列表,您最终会得到 [0, 1, 2, 3, 4, 5, 6, 7 ,8] 这就是 range(9) 函数的作用。假设实例化 None 列表是有用的,而不是立即用数字填充它 (3认同)
  • @Zyl `range` 不是列表,也不是生成器。它是“Sequence”的内置不可变子类。 (2认同)

Kar*_*tel 5

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

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

所有列表都可以包含任意数量的元素,但仅限于可用内存的限制.重要的列表的唯一"大小"是当前其中的元素数量.

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

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
Run Code Online (Sandbox Code Playgroud)

您将注意到的下一个问题是您的列表实际上只有9个元素,因为该range函数会跳过结束点.(正如附注中所说的[]那样list(),分号是不必要的,分号是s1变量的一个很差的名称,range如果你从一开始就只需要一个参数0.)那么你最终会得到

def create_list():
    result = list()
    for i in range(10):
        result[i] = i
    return result
Run Code Online (Sandbox Code Playgroud)

然而,这仍然是标志; range是不是这就是语言的一部分的方式一些神奇的关键字fordef是,而是它的一个功能.并猜猜该函数返回什么?那是对的 - 这些整数的列表.所以整个功能都崩溃了

def create_list():
    return range(10)
Run Code Online (Sandbox Code Playgroud)

现在你明白为什么我们根本不需要自己写一个函数了; range已经是我们正在寻找的功能.虽然,再次,没有必要或理由"预先确定"列表的大小.


mso*_*ona 5

n使用嵌套列表推导式创建二维大小矩阵的一种简单方法:

m = [[None for _ in range(n)] for _ in range(n)]
Run Code Online (Sandbox Code Playgroud)


Gul*_*zar 5

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

> pip install numpy

import numpy as np


a = np.empty(10, dtype=np.object)
a[1] = 2
a[5] = "john"
a[3] = []
Run Code Online (Sandbox Code Playgroud)

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

a = np.arange(10)
Run Code Online (Sandbox Code Playgroud)