Перебор элементов переменных аргументов - PullRequest
0 голосов
/ 20 октября 2018

У меня есть функция scalar_func(*args), которая принимает скалярные числа с переменным числом.Он преобразует некоторые математические с ними и выводит скаляр.В качестве тривиального примера мы предположим, что scalar_func умножает каждое число:

def scalar_func(*args):
    out = 1    
    for arg in args:
        out *= arg
    return out

Я бы хотел, чтобы scalar_func работал со списками.Для этого я сделал еще одну функцию list_func(*args).Он принимает переменное количество списков и создает новый, например, так:

def list_func(*args):
    out = []
    for i in range(len(arg[0])):
         out.append(scalar_func(arg[0][i], arg[1][i], arg[2][i]...)
    return out

Очевидно, эта функция является просто псевдокодом.Как я могу реализовать list_func?

1 Ответ

0 голосов
/ 20 октября 2018

Вы можете использовать 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)))
...