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)