0

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

4 回答 4

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 数据结构

一旦你了解了如何使用 for 循环,理解列表推导就很容易了。

与 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]
于 2012-06-20T19:49:37.000 回答
3

您的代码中有很多错误,应该阅读Python 教程

for i in a迭代 a 的元素,而不是它们的索引。所以你想要i*j,不是a[i]*b[j]。此外,append.multi(y)这不是附加到列表的正确方法,而且您也没有定义任何调用的变量y,因此不清楚您要做什么。阅读教程。

于 2012-06-20T19:42:05.880 回答
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]
于 2012-06-20T19:59:48.857 回答
0

for i in a不返回索引,它返回值。你应该做这个:

for i in a: for j in b: multi=i*j ...
于 2012-06-20T19:42:12.130 回答