数组乘法

时间:2012-06-20 19:39:16

标签: python arrays list

我试图在不使用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

4 个答案:

答案 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 ...