我正在尝试编写一个成对乘法器函数,该函数需要两个参数,两个参数都是列表。 pairwise_multiply应该返回一个新列表,其中两个输入列表中的每个元素以成对方式相乘。例如
result = pairwise_multiply([1, 2], [3, 4])
print(result)
> [3, 8]
这是我目前的功能,但我不断收到语法错误:
def pairwise_multiply([l1], [l2]):
i = 0
while 1 <= len(l1):
lst = int(l1[i] * l2[i])
i = i + 1
return lst
答案 0 :(得分:3)
在您的代码中-
def pairwise_multiply([l1], [l2]):
您不需要方括号即可将列表作为参数传递。替换为-
def pairwise_multiply(l1, l2):
另一种实现方式,更多的 pythonic 是将列表理解与zip-
一起使用[i*j for i, j in zip(l1, l2)]
zip的作用是(根据官方文档)-
制作一个迭代器,以聚合每个可迭代对象中的元素。
返回一个元组的迭代器,其中第i个元组包含每个自变量序列或可迭代对象中的第i个元素。当最短的可迭代输入耗尽时,迭代器将停止。仅使用一个可迭代的参数,它将返回1元组的迭代器
答案 1 :(得分:2)
此代码段中存在一些语法和逻辑错误。
def pairwise_multiply([l1], [l2])
正如@FHTMitchell指出的那样,命名参数时,您应该不能不使用[...]
。这应该是def pairwise_multiply(l1, l2)
while 1 <= len(l1)
是指i
,而不是1
,对吧?否则,您将陷入无限循环。另外,由于Python使用基于零的索引,因此<=
应该变成<
。
您每次迭代都覆盖lst
。您的函数将仅返回(如果有,请参阅上一点)最后一次乘法的结果。
考虑到这些因素,您的代码可以转换为
def pairwise_multiply(l1, l2):
lst = []
i = 0
while i < len(l1):
lst.append(int(l1[i] * l2[i]))
i = i + 1
return lst
但是它有很多故障点(例如,如果l1
和l2
的长度不一样怎么办?),它太长且不是pythonic。
我们可以使用zip
并列出其答案中建议的@ThatBird之类的理解。