两个列表之间元素的成对乘法

Pairwise multiplication of elements between two lists

我正在尝试计算一个列表中的每个元素乘以另一个列表中的每个元素的乘积。从每个列表中彼此相乘。

比如我在list1中有4,需要在list2中乘以3。接下来,list1中的4需要乘以list2中的1。该模式一直持续到我收到输出:[12,4,36,8,6,2,18,4,21,7,63,14]。我没能做到这一点——这是我目前的代码:

def multiply_lists(list1,list2):
    for i in range(0,len(list1)):
        products.append(list1[i]*list2[i])
    return products

list1 = [4,2,7]
list2 = [3,1,9,2]
products = []
print ('list1 = ',list1,';','list2 = ', list2) 
prod_list = multiply_lists(list1,list2)
print ('prod_list = ',prod_list)

你很接近。您真正需要的是两个 for 循环,这样您就可以将一个列表中的每个值与第二个列表中的所有值进行比较。例如

def multiply_lists(list1, list2):
    for i in range(len(list1)):
        for j in range(len(list2)):
            products.append(list1[i] * list2[j])
    return products

你也不需要range列,你可以直接遍历每个列表的项目:

def multiply_lists(list1, list2):
    for i in list1:
        for j in list2:
            products.append(i * j)
    return products

你也可以这样理解:

def multiply_lists(list1, list2):
    return [i * j for i in list1 for j in list2]

像这样使用列表理解

print([i * j for i in list1 for j in list2])

输出:

[12, 4, 36, 8, 6, 2, 18, 4, 21, 7, 63, 14]

这里有两种简洁的方法。

第一个使用 itertools.product() 和列表理解:

from itertools import product

[x * y for x, y in product(list1, list2)]

但是,对于 itertools.starmap(),这个问题非常 well-suited,这激发了第二种方法。如果您不熟悉该函数,它有两个参数:

  • 接受两个参数的函数。在这种情况下,我们使用 operator.mul,一种可以传递给函数的乘法运算符。请注意,函数可以传递给 Python 中的其他函数,因为函数是 first class.
  • 大小为二的可迭代对象中的可迭代对象。在这种情况下,它是我们从 itertools.product().
  • 的输出

对于我们可迭代对象中的每个元素,它将元素解包并将每个元素作为参数传递给第一个参数指定的函数。这给了我们:

from itertools import product, starmap
import operator

list(starmap(operator.mul, product(list1, list2)))

这两个输出:

[12, 4, 36, 8, 6, 2, 18, 4, 21, 7, 63, 14]

如果您想将此方法扩展到两个以上的可迭代对象,您可以这样做(如 flakes 所建议):

from math import prod
list(map(prod, product(list1, list2, <specify more iterables>)))

其他答案建议在理解中使用多个 for 循环。注意some consider this approach to be poor styleitertools.product() 的使用完全避免了这个问题。

如果您有任何疑问,请随时发表评论——我非常乐意澄清任何困惑。我意识到这些解决方案可能不是最多的beginner-friendly。至少,我希望这些方法对未来的读者有用。

您应该使用嵌套循环将 2 个列表或更多列表的元素相乘以相互相乘。

更正答案:

def multiply_lists(list1,list2):
    for i in list1:
        for j in list2:
            products.append(i*j)
    return products

list1 = [4,2,7]
list2 = [3,1,9,2]
products = []
print ('list1 = ',list1,';','list2 = ', list2) 
prod_list = multiply_lists(list1,list2)
print ('prod_list = ',prod_list)