Список парных множителей аргументов Python - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь написать функцию попарного умножения, которая принимает два аргумента, оба являются списками. 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

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

В этом фрагменте есть некоторые синтаксические и логические ошибки.

  • 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 не имеют одинаковую длину?), Слишком длинный и не питонический.

Мы можем использовать zip и составить список, как @ThatBird предложил в своем ответе.

0 голосов
/ 30 августа 2018

В вашем коде здесь -

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 кортежами

...