Python 仅当列表元素列表[i]与列表[j]相乘时的代码<;J

Python 仅当列表元素列表[i]与列表[j]相乘时的代码<;J,python,python-2.7,list,Python,Python 2.7,List,例如,如果a=[1,2,3,4,5],我希望1与所有其他元素相乘,2与3,4,5相乘,依此类推。我希望将乘法乘积附加到最终输出的列表中 我编写了以下代码,但它不起作用(只提供一个空列表作为输出): a=[1,2,3,4,5] b=[] 对于范围(5)中的i: 对于范围(5)内的j: 如果我如果我运行这个,我会得到一个: IndexError: list assignment index out of range 这是因为b是一个空列表,因此b[0](或任何其他b[i])超出范围 然而,您的目标

例如,如果
a=[1,2,3,4,5]
,我希望1与所有其他元素相乘,2与3,4,5相乘,依此类推。我希望将乘法乘积附加到最终输出的列表中

我编写了以下代码,但它不起作用(只提供一个空列表作为输出):

a=[1,2,3,4,5]
b=[]
对于范围(5)中的i:
对于范围(5)内的j:
如果我如果我运行这个,我会得到一个:

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))]
(即
[1*2,1*3,1*4,1*5,2*3,2*4,2*5,3*4,3*5,4*5]

这里没有明确检查边界,我们只是将
j
范围(..)
设置为从
i+1
开始(因此我们只知道每个
j
都将大于
i

另一种可能更优雅的选择是使用
itertools.compositions
module:

from itertools import combinations

b = [x*y for x,y in combinations(a,2)]
来自itertools导入组合的


b=[x*y代表x,y的组合(a,2)]
这将完成所有需要的乘法运算。您会注意到我打印结果而不是分配结果,因为您的尝试会重复分配相同的值。当你弄清楚你真正想要的是什么,你就可以解决它

for j in range(len(a)):
    for i in range(j):
        print a[i]*a[j] ,
    print

无法分配不存在的索引。因此,您应该使用
list.append
方法代替。

使用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]
按需要导入itertools
a=[1,2,3,4,5]

b=[el_i*el_j表示其中的(i,el_i),(j,el_j)乘积(枚举(a),重复=2),如果我看到你*分配给
b[i]
但这并不存在?@NoahCristino:但这只是列表理解中的一个嵌套for循环。你改变了它。看起来更好的地方是
j
将小于
i
。虽然乘法是可交换的,但在这里无关紧要,一般来说,这个程序不起作用。请仔细阅读。你交换了范围。但是这可能会改变元素的顺序。不,我没有。顶部循环始终是
j
。我的意思是与原始问题相比。我的意思是,对于泛型运算符(而不是
*
本身),这可能会导致列表中出现相同的元素,但顺序不同。
for j in range(len(a)):
    for i in range(j):
        print a[i]*a[j] ,
    print
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)