这是一个简单的问题,我不知道自己做错了什么。基本上我想迭代空列表中的项目,并根据某些标准增加每个项目。这是我正在尝试做的一个例子:
list1 = []
for i in range(5):
list1[i] = list1[i] + 2*i
此操作因list index out of range
错误而失败,我被卡住了。预期的结果(我的目标)是一个带有值的列表:
[0, 2, 4, 6, 8]
更明确一点:我不是在制作那个特定的列表之后。问题是如何以递归方式修改空列表的项目。正如下面的gnibbler所示,初始化列表就是答案。欢呼声。
答案 0 :(得分:8)
Ruby(例如)允许您分配超出列表末尾的项目。 Python没有 - 你必须像这样初始化list1
list1 = [0] * 5
答案 1 :(得分:6)
因此,当你这样做时,你实际上正在使用我,所以你可以对我进行数学运算,并设置它来做到这一点。当你已经拥有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!有一个名为vectorize的好东西,所以你可以将一个函数应用到一维数组:
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 broadcasting来轻松地将其乘以2。
答案 2 :(得分:3)
您的列表为空,所以当您尝试读取列表中的元素时(此行的右侧)
list1[i] = list1[i] + 2*i
它不存在,因此您收到错误消息。
答案 3 :(得分:1)
您可能还希望考虑使用numpy
。乘法运算被重载以在阵列的每个元素上执行。根据列表的大小以及您计划对其执行的操作,使用numpy
可能是最有效的方法。
示例:
>>> import numpy
>>> 2 * numpy.arange(5)
array([0, 2, 4, 6, 8])
答案 4 :(得分:0)
我会改为写
for i in range(5):
list1.append(2*i)
答案 5 :(得分:0)
另一种方法是在列表中使用append方法。你得到超出范围错误的原因是因为你说:
list1 = []
list1.__getitem__(0)
然后操作此项 BUT 该项目不存在,因为您创建了一个空列表。
概念证明:
list1 = []
list1[1]
IndexError: list index out of range
但是,我们可以将新的 stuff 添加到此列表中,如下所示:
list1 = []
for i in range(5):
list1.append(i * 2)