代码存在一些问题:
Python 使用零索引
Python 中列表的第一个元素的索引为 0。在你的 for 循环中:
for i in factor:
multiply = [values[i]*i]
最后一次迭代将尝试访问values[3]。但是values只有3个元素,所以最后一个元素是values[2],不是values[3]。
列表和整数的乘法 * 实际上并不相乘
将列表乘以Int,例如n,会得到一个新列表,该列表将原始n 次连接起来。例如:
>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
在列表上实际广播乘法的最直接方法是使用“列表推导”。例如:
>>> [3*x for x in [1,2,3]]
[3, 6, 9]
将其应用到您的示例中将类似于:
for i in factors:
multiply = [i*x for x in values[i-1]]
您只保留multiply 中的最后一个计算
每次循环您的for 循环,您都会为multiply 分配一个新值,覆盖之前的所有值。如果你想收集你所有的结果,那么你应该append 到multiply 列表。
multiply.append([i*x for x in values[i-1]])
总的来说,您的示例固定为:
factors = [1,2,3]
values = [[1,2,3],[3,1,4],[5,5,2]]
multiply = []
for i in factors:
multiply.append([i*x for x in values[i-1]])
改进
但是,在简洁性和可读性方面仍有改进代码的方法。
问题的根源是将列表的元素乘以一个数字。 * 做不到,但你可以编写自己的函数:
def multiply_list(X, n):
return [n*x for x in X]
然后您可以使用此函数和列表推导来删除 for 循环:
multiply = [multiply_list(x, i) for (x, i) in zip(values, factors)]
或者,如果你认为它是可读的,那么你可以使用嵌套列表推导,它更简洁:
multiply = [[factor * x for x in value] for (value, factor) in zip(values, factors)]