Применить функцию n раз, используя все предыдущие результаты

Мне было интересно, есть ли питонный способ применить функцию несколько раз, когда все последние результаты снова вводятся с использованием понимания списка или выражения генератора вместо цикла for, подобного этому?

import numpy as np

def func(x, s):
    return (5+sum(x))**(-1.06)/s

y = np.array([])
for i in range(5):
    y = np.append(y, func(y[:i], s=i+1))

РЕДАКТИРОВАТЬ: К сожалению, itertools.accumulate Кажется, учитывают только последние, но не все последние результаты. Есть еще идеи?

1 ответ

Похоже, что нет встроенного, но это достаточно легко сделать:

def pastmap(f, inputs):
    """
    :param f: A function of the form y[i] = f(y[:i], inputs[i])
    :param inputs: An iterable of inputs
    :return: A list of length: len(inputs)
    """
    results = []
    for x in inputs:
        new_result = f(results, x)
        results.append(new_result)
    return results


def func(x, s):
    return (5+sum(x))**(-1.06)/s


y = np.array(pastmap(func, range(1, 6)))

Обратите внимание, что по крайней мере для вашего примера это очень неэффективно, потому что вы постоянно берете сумму растущего списка, который O(N^2) (будет лучше (O(N)) чтобы сохранить текущую сумму и использовать это)

Другие вопросы по тегам