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


545

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

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

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

print  s1

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

有人可以解释为什么吗?



7
根据[]定义,“空列表”()具有零个元素。你显然需要的是像falsy值的列表None0''
dan04 '16

要从中生成列表09您应该实际使用for i in range(0, 10),这意味着for (int i = 0, i < 10, i++)
Atcold

Answers:


830

您不能分配给类似的列表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]

17
您的意思是“您不能分配给像lst [i] = something之类的列表”-当然可以!您不能做的就是分配一个超出当前列表长度的不存在的元素
Sergey

5
“除非列表已使用至少i + 1个元素初始化” ....
MrR

5
您可以这样做:a = [0 for _ in range(10)]
卡米亚尔(Kamiar)

是否可以使用list()函数做到这一点?
劳尔·基亚雷拉

125

尝试以下方法:

lst = [None] * 10

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

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

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

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

更简单的一点是,在Python 2.x中,您可以执行以下操作以初始化值从0到9的列表:

lst = range(10)

在Python 3.x中:

lst = list(range(10))

2
另一个很棒的事情是您可以使用默认值初始化列表。lst = [''] * 10lst = [0] * 10
Anthony Manning-Franklin

2
理解示例的一种变体。如果数组中的所有元素在初始化时都需要为空,请使用:arr = [None for _ in range(10)]
Doug R.

85

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

19
我听说append经常使用不如列出理解。您可以通过创建清单列表[ [] for _ in range(10)]
M.Herzkamp '16

10
因为我发疯了而感到不适,因为我有多次重复的多维数组,这些数组重复了相同的数据,并且在最终找到这个答案之前无法弄清楚发生了什么。^^我不明白为什么它这么低。
布雷加拉德

19

您可以.append(element)进入列表,例如:s1.append(i)。您当前要执行的操作是访问s1[i]不存在的元素()。


16

有两种“快速”方法:

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

请注意,在Python3中,您将不得不使用它list(range(n)),因为range()它不会返回列表,而是一个迭代器,并且速度不比快[None] * n
Skillmon喜欢topanswers.xyz

10

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

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

7
执行上述操作与执行操作之间最重要的区别在于x = [[]] * 10,在后者中,列表中的每个元素都指向SAME列表对象。因此,除非您只想要同一个对象的10个副本,否则请使用range基于变量的变量,因为它会创建10个对象。我发现这种区别非常重要。
Mandeep Sandhu '18

6

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

我想创建一个空列表(或最好的方法)以容纳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

您将要注意的下一个问题是列表实际上仅包含9个元素,因为该range函数跳过了终点。(作为旁注,其[]效果与一样好list(),并且不需要分号,它s1是变量的较差名称,并且range如果从0。开始,则只需要一个参数。)因此,最后得到

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

但是,这仍然没有实现。range是不是这就是语言的一部分的方式一些神奇的关键字fordef是,而是它的一个功能。猜猜该函数返回什么?没错-这些整数的列表。所以整个功能都崩溃了

def create_list():
    return range(10)

现在您了解了为什么我们根本不需要自己编写函数;range已经是我们要寻找的功能。同样,尽管没有必要或没有理由“调整”列表大小。


4

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

list(range(9))

1
关于为什么有人对此发表评论有点好奇...我是一个python noob,我看起来像是要走的路,但是没人说什么。范围函数可能很昂贵还是什么?
AFP_555

3
问题是此答案不会按问题创建空列表,您最终会得到[0,1,2,3,4,5,6,7,8],这是range(9)函数的作用。假设实例诺内斯的列表,而不是用数字填充它的时候了有用
Spcogg第二

为什么包裹range(9)list()?还没有range(9)返回列表?
Zyl

2
@Zyl range不是列表,也不是生成器。这是的内置不变子类Sequence
努诺·安德烈

@ AFP_555我认为真正的问题是,为什么它不被更多地投票,因为它不能真正回答问题,并且可能会带来意想不到的严重后果。
eric

4

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

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

1

这是我在python中的2D列表的代码,它将显示为no。输入的行数:

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('')

-2

我在寻找类似问题时遇到了这样的问题。我必须构建一个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循环。希望这对遇到这篇文章的其他人有所帮助。


-2

使它作为功能更可重用。

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

-3
s1 = []
for i in range(11):
   s1.append(i)

print s1

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

要将某些内容添加到列表中,请使用list.append()


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.