Как в Python сгенерировать вложенный список конечных разностей?
Решаю задачу, в которой необходимо рассчитать конечные разности Δy. Имеем исходный список значений y: [0.0000, 0.0016, 0.5875, 0.8087, 0.9509, 1.0000].
Надо получить разности:
из последующего значения вычесть предыдущее (например: 0.0016-0.000; 0.5875-0.0016 и так далее) - на выходе нам нужен список, где значений на одно меньше; продолжим вычитание с рассчитанными разностями - на выходе снова список, где значений еще на одно меньше. Так идем до тех пор, пока не останется одно значение, из которого вычитать нечего.
В итоге хотел бы иметь список списков с конечными разностями: [ [Δ1, Δ2, Δ3], [Δ4, Δ5], [Δ6] ].
Я реализовал код, где получаю значения None, причем в каждом вложенном списке их не становится на одно меньше - это не то, чего я хочу иметь на выходе:
[[None, None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None]]
Вот мой код:
my_list = [0.0000, 0.0016, 0.5875, 0.8087, 0.9509, 1.0000]
n=3
diff_list = []
data = [[diff_list.append(y-x) for x, y in zip(my_list[0::], my_list[1::])] for i in range(0, n)]
print(data)
Ответы (3 шт):
С праздником! В общем в голову пришло использовать рекурсию. Этот код не идеальный, поэтому приму конструктивную критику от более опытных разработчиков.
def recurs(data, lst):
if len(lst) == 1: # ещё можно добавить проверку на пустой список
return
temp = []
for i in range(len(lst) - 1):
temp.append(lst[i + 1] - lst[i])
data.append(temp)
recurs(data, temp)
my_list = [0.0000, 0.0016, 0.5875, 0.8087, 0.9509, 1.0000]
data = []
recurs(data, my_list)
print(data)
Вот моя версия:
from itertools import zip_longest
y = [0.0000, 0.0016, 0.5875, 0.8087, 0.9509, 1.0000]
result = []
while len(y) != 1:
# получение пар чисел (если длинна "y" нечётная, то последней парой будет (число - 0)) и вычитание их
# print(list(zip_longest(y[::2], y[1::2], fillvalue=0)))
y = [list_[1] - list_[0] for list_ in zip_longest(y[::2], y[1::2], fillvalue=0)]
result.append(y)
print(result)
Вот еще подсказали:
import numpy as np
my_list = [0.0000, 0.0016, 0.5875, 0.8087, 0.9509, 1.0000]
result = [np.diff(my_list, n=d) for d in range(1, len(my_list))]
Или вот решение - на случай большого списка my_list:
result = []
for d in range(1, len(my_list)):
result.append(np.diff(my_list if d == 1 else result[-1]))