繁体   English   中英

仅当i <j时用于将列表元素list [i]和list [j]相乘的代码

[英]Code for multiplying list elements list[i] and list[j] only if i<j

例如,如果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)

如果我在运行此命令,则会得到:

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]

这里没有明确检查边界,我们只是将jrange(..)设置为从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)

这将完成您想要的所有乘法。 您会注意到我打印结果而不是分配结果,因为您的尝试将反复分配给相同的值。 当您确定自己真正想要什么时,可以对其进行修复。

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

您不能分配不存在的索引。 因此,您应该改用list.append方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM