例如,如果a=[1,2,3,4,5]
,我希望1乘以所有其他元素,2乘以3,4,5等。我希望将乘法产品附加到最终输出的列表中。
我编写了以下代码,但它不起作用(仅给出一个空列表作为输出):
a = [1,2,3,4,5]
b = []
for i in range(5):
for j in range(5):
if i<j:
b[i]=a[i]*a[j]
print(b)
如果我在python-2.7中运行,我会得到:
IndexError: list assignment index out of range
那是因为b
是一个空列表,因此b[0]
(或任何其他b[i]
)超出了范围。
您的目标可能是:
b = [a[i]*a[j] for i in range(len(a))
for j in range(i+1,len(a))]
生成:
>>> b
[2, 3, 4, 5, 6, 8, 10, 12, 15, 20]
(是[1*2, 1*3, 1*4, 1*5, 2*3, 2*4, 2*5, 3*4, 3*5, 4*5]
)
在这里,范围不是明确检查,我们只是将j
的range(..)
设置为在i+1
开始(因此我们只知道每个j
都大于i
)。
一种替代方案 - 可能更优雅 - 可能是使用itertools.combinations
模块:
from itertools import combinations
b = [x*y for x,y in combinations(a,2)]
使用itertools的另一种解决方案:
import itertools as it
a = [1,2,3,4,5]
b = [el_i * el_j for (i, el_i), (j, el_j) in it.product(enumerate(a), repeat = 2) if i<j]
另外,正如其他人指出的那样,您可能想在示例中这样做:
a = [1,2,3,4,5]
b = []
for i in range(5):
for j in range(5):
if i<j:
# Use append here as b is initialised as empty list
b.append(a[i]*a[j])
print(b)
您无法分配不存在的索引。因此,您应该使用list.append
方法。
这将完成您想要的所有乘法。您会注意到我打印结果而不是分配结果,因为您的尝试会反复分配给相同的值。当您弄清楚自己真正想要的东西时,可以修复它。
for j in range(len(a)):
for i in range(j):
print a[i]*a[j] ,
print