我试图在不使用numpy的情况下将两个数组相乘。但是,我在“multi = a [i] * b [j]”行上收到错误,指出索引超出范围。
a = [1,2,3]
b = [4,5,6]
multi = [0,0,0,0,0,0,0,0]
for i in a:
for j in b:
multi = a[i]*b[j]
append.multi(y)
print multi
答案 0 :(得分:4)
让我们从您尝试的内容开始。 for循环:
a = [1,2,3]
b = [4,5,6]
ab = []
for x in a:
for y in b:
ab.append(x * y)
print(ab)
[4, 5, 6, 8, 10, 12, 12, 15, 18]
现在,我建议你在这里阅读python data structures
一旦你理解了如何使用for循环,理解列表理解就很容易了。
循环是相同的,但结果直接进入列表。这很好。事实上,几乎每个人都这样做是非常好的。
a = [1,2,3]
b = [4,5,6]
ab = [ x * y for x in a for y in b ]
print(ab)
[4, 5, 6, 8, 10, 12, 12, 15, 18]
所以,我们写for ... ab.append(x * y)
[ x * y for ... ]
现在如果代码是这样写的:
ab = ( x * y for x in a for y in b )
它会使它成为一个发电机。很多人也使用这些。把它们想象成懒惰的列表。您可以将内容放入其中,但在尝试使用它之前不会对其进行评估。
print(ab)
<generator object <genexpr> at 0x4d7058>
print( list(ab) )
[4, 5, 6, 8, 10, 12, 12, 15, 18]
如果您'试图使用索引解决此问题,我可能会使用:
[a[x] * b[y] for x,_a in enumerate(a) for y,_b in enumerate(b)]
你也可以做有趣的事情:
from operator import mul
a = [1,2,3]
b = [4,5,6]
ab = list(map(mul, a,b))
print(ab)
[4, 10, 18]
如果您使用:
ab = map(mul, a,b)
你会创建一个地图对象......这与< generator >
非常相似。
print(ab)
>>> <map object at 0x4d4eb0>
print( list(ab) )
>>> [4, 10, 18]
或者如果您有三个列表:
a = [1,2,3]
b = [4,5,6]
c = [7,8,9]
abc = list(map(lambda x,y,z: x * y * z, a,b,c))
print(abc)
[28, 80, 162]
如果你真的想要,你可以这样做:
from itertools import product
from functools import reduce
from operator import mul
a = [1,2,3]
b = [4,5,6]
ab = list(map(lambda x: reduce(mul,x), product(a,b)))
--or--
ab = list(map(lambda x: mul(*x), product(a,b)))
print(ab)
[4, 5, 6, 8, 10, 12, 12, 15, 18]
答案 1 :(得分:3)
您的代码中有很多错误,应该阅读Python tutorial。
for i in a
遍历a的元素,而不是它们的索引。所以你想要i*j
,而不是a[i]*b[j]
。此外,append.multi(y)
不是附加到列表的正确方法,并且您不会定义任何名为y
的变量,因此您不清楚您要尝试做什么。阅读教程。
答案 2 :(得分:2)
使用列表理解:
a = [1,2,3]
b = [4,5,6]
m = [x * y for x in a for y in b]
print m
>>> [4, 5, 6, 8, 10, 12, 12, 15, 18]
答案 3 :(得分:0)
for i in a
不返回索引,它返回值。你应该这样做:
for i in a: for j in b: multi=i*j ...