Применить функцию 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)
) чтобы сохранить текущую сумму и использовать это)