Как в 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 шт):

Автор решения: zomaman

С праздником! В общем в голову пришло использовать рекурсию. Этот код не идеальный, поэтому приму конструктивную критику от более опытных разработчиков.

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)
→ Ссылка
Автор решения: Universall

Вот моя версия:

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]))
→ Ссылка