4

这是一个如此简单的问题,我不知道我做错了什么。基本上我想遍历一个空列表中的项目并根据一些标准增加每个项目。这是我正在尝试做的一个例子:

list1 = []
for i in range(5):
    list1[i] = list1[i] + 2*i

这失败并出现list index out of range错误,我被卡住了。预期的结果(我的目标)将是一个包含值的列表:

[0, 2, 4, 6, 8]

更清楚一点:我不是在制作那个特定的列表之后。问题是关于如何以递归方式修改空列表的项目。正如 gnibbler 所示,初始化列表就是答案。干杯。

4

6 回答 6

8

Ruby(例如)允许您分配列表末尾之外的项目。Python 没有 - 你必须像这样初始化 list1

list1 = [0] * 5
于 2013-06-03T18:24:35.743 回答
6

因此,在执行此操作时,您实际上是在使用 i,因此您可以对 i 进行数学运算并将其设置为执行此操作。当您已经拥有i. 所以只要做列表理解:

list1 = [2*i for i in range(5)]

既然您说它更复杂,请不要使用列表理解,请编辑您的 for 循环:

for i in range(5):
    x = 2*i
    list1[i] = x

这样你就可以继续做事情,直到你最终得到你想要的结果,将它存储在一个变量中,并相应地设置它!您也可以这样做list1.append(x),我实际上更喜欢这样做,因为它可以与任何列表一起使用,即使它不像列表那样按顺序排列range

编辑:由于您希望能够像您一样操作数组,我建议使用 numpy!有一个很棒的东西叫做向量化,所以你实际上可以将一个函数应用于一维数组:

import numpy as np
list1 = range(5)
def my_func(x):
    y = x * 2
vfunc = np.vectorize(my_func)
vfunc(list1)
>>> array([0, 2, 4, 6, 8])

我建议仅将其用于更复杂的功能,因为您可以使用numpy 广播来进行简单的事情,例如乘以 2。

于 2013-06-03T18:24:39.580 回答
3

您的列表是空的,因此当您尝试读取列表的元素时(此行的右侧)

list1[i] = list1[i] + 2*i

它不存在,因此您会收到错误消息。

于 2013-06-03T18:29:44.230 回答
1

您可能还希望考虑使用numpy. 乘法运算被重载以对数组的每个元素执行。根据列表的大小和计划对其执行的操作,使用numpy非常好可能是最有效的方法。

例子:

>>> import numpy
>>> 2 * numpy.arange(5)
array([0, 2, 4, 6, 8])
于 2013-06-03T18:25:19.510 回答
0

我会改为写

for i in range(5):
    list1.append(2*i)
于 2013-06-03T18:25:24.320 回答
0

另一种方法是使用列表中的 append 方法。您收到超出范围错误的原因是因为您在说:

list1 = []
list1.__getitem__(0) 

然后操作这个项目,但是这个项目不存在,因为你做了一个空列表。

概念证明:

list1 = []
list1[1]
IndexError: list index out of range

然而,我们可以像这样在这个列表中添加新的东西:

list1 = []
for i in range(5):
    list1.append(i * 2)
于 2017-04-04T19:47:46.513 回答