Вы можете использовать zip
здесь:
def scalar_func(*values):
return sum(values)
def list_func(*args):
out = []
L = list(zip(*args))
for i in range(len(args[0])):
out.append(scalar_func(*L[i]))
return out
list_func([0, 1, 2], [3, 4, 5]) # [3, 5, 7]
Если у вас большие списки, вы можете создать итератор и использовать next
для уменьшения потребления памяти:
def list_func(*args):
out = []
L = iter(zip(*args))
for i in range(len(args[0])):
out.append(scalar_func(*next(L)))
return out
Это также можно переписать для большей эффективности:
def list_func(*args):
return [scalar_func(*i) for i in zip(*args)]
В качестве альтернативы вы можете itertools.starmap
для функционального эквивалента:
from itertools import starmap
def list_func(*args):
return list(starmap(scalar_func, zip(*args)))