-2

我正在尝试编写一个成对的乘法器函数,它接受两个参数,都是列表。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
4

2 回答 2

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 元组的迭代器

于 2018-08-30T12:30:33.800 回答
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

但是它有很多失败点(例如,如果l1l2不一样的长度怎么办?),太长而且不是pythonic。

我们可以zip像@ThatBird 在他们的回答中建议的那样使用和列出理解。

于 2018-08-30T12:38:22.407 回答