751

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

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

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

print s1

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

有人可以解释为什么吗?

4

17 回答 17

1151

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

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

>>> def display():
...     return [x**2 for x in range(9)]
... 
>>> print display()
[0, 1, 4, 9, 16, 25, 36, 49, 64]
于 2012-05-23T00:44:12.223 回答
183

试试这个:

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)

或者更简单,在 Python 2.x 中,您可以这样做来初始化一个值从 0 到 9 的列表:

lst = range(10)

在 Python 3.x 中:

lst = list(range(10))
于 2012-05-23T00:41:42.897 回答
127

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]]
于 2015-11-04T03:39:09.853 回答
20

有两种“快速”方法:

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
于 2016-02-15T22:38:27.640 回答
19

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

于 2012-05-23T00:40:21.493 回答
18

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

x = [[] for i in range(10)]
于 2017-12-11T07:14:02.507 回答
17

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

>>> 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}, {}, {}]
>>> 
于 2020-06-11T16:14:32.310 回答
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,只需要一个参数。)所以你最终得到range0

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

但是,这仍然没有达到目的。range不是某种神奇的关键字,它是语言的一部分fordef而是一个函数。猜猜那个函数返回什么?没错——这些整数的列表。所以整个函数折叠为

def create_list():
    return range(10)

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

于 2012-05-23T00:50:07.423 回答
6

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

m = [[None for _ in range(n)] for _ in range(n)]
于 2019-04-11T11:37:15.197 回答
4

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

list(range(9))
于 2018-10-22T08:40:57.820 回答
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('')
于 2018-01-05T19:00:35.523 回答
1

另一种选择是将 numpy 用于固定大小的数组(指针):

> pip install numpy

import numpy as np


a = np.empty(10, dtype=np.object)
a[1] = 2
a[5] = "john"
a[3] = []

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

a = np.arange(10)
于 2022-01-05T15:56:44.790 回答
0

从技术上讲不是列表,但在功能方面类似于列表,并且它是固定长度的

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

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

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

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

于 2021-02-05T05:48:00.630 回答
-1

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

于 2018-02-18T20:52:06.807 回答
-3
s1 = []
for i in range(11):
   s1.append(i)

print s1

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

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

于 2018-01-02T13:05:00.717 回答
-3

使其作为函数更可重用。

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
于 2018-07-22T03:43:38.770 回答
-5

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

import random
numrand=[]
for i in range(0,10):
   a = random.randint(1,50)
   numrand.append(a)
   print(a,i)
print(numrand)
于 2018-05-28T20:26:17.410 回答