Список арифметических последовательностей и накопительных сумм

У меня есть список времени (секунд), который выглядит так:

l = [2,4,6,8,2,4,6,8,10,30,60,30,60]
  • 2,4,6,8 — первый временной интервал.

  • 2,4,6,8,10 второй временной интервал.

  • 30,60 третий временной интервал.

  • 30,60 четвертый временной интервал.

Я хотел бы создать совокупный список времени, как показано ниже, чтобы я мог построить данные:

l = [2,4,6,8,10,12,14,16,18,48,78,108,138]

🤔 А знаете ли вы, что...
Python используется в разработке игр с помощью библиотеки Pygame.


105
2

Ответы:

Вы можете использовать алгоритм для разбивки l на основе арифметических последовательностей, генерирования ожидаемого результата с помощью res += [res[-1] + prev_diff] и, наконец, построения графика результата:

import matplotlib.pyplot as plt


def _sequences(L):
    if len(L) < 3:
        return L
    start, parts = 0, []
    prev_diff = L[1] - L[0]
    D = {}
    j = 0
    res = [L[0]]
    for i in range(1, len(L)):
        curr_diff = L[i] - L[i - 1]
        if prev_diff != curr_diff:
            D[j] = prev_diff
            j += 1
            parts.append(L[start:i])
            start = i
            prev_diff = L[i + 1] - L[i] if i + 1 < len(L) else 0
        res += [res[-1] + prev_diff]
    parts.append(L[start:])
    D[j] = prev_diff
    return parts, D, res


L = [2, 4, 6, 8, 2, 4, 6, 8, 10, 30, 60, 30, 60]

parts, D, res = _sequences(L)

print(parts, D, res)

plt.plot(res, marker='o')
plt.xlabel("X")
plt.ylabel("Y")
plt.grid(True)
plt.show()



Принты

[[2, 4, 6, 8], [2, 4, 6, 8, 10], [30, 60], [30, 60]] {0: 2, 1: 2, 2: 30, 3: 30} [2, 4, 6, 8, 10, 12, 14, 16, 18, 48, 78, 108, 138]


Решено

Код

сделать l серии панд s

import pandas as pd
l = [2,4,6,8,2,4,6,8,10,30,60,30,60]
s = pd.Series(l)

с

0      2
1      4
2      6
3      8
4      2
5      4
6      6
7      8
8     10
9     30
10    60
11    30
12    60
dtype: int64

Ваша логика слишком неясна, чтобы предоставить код, решающий вашу проблему. Однако если предполагается, что каждая из ваших групп интервалов представляет собой один и тот же интервал и каждая группа имеет достаточное количество интервалов (как в вашем примере), вы можете попробовать код ниже.

grp = s.mul(2).eq(s.shift(-1)).cumsum()
out = s.add(grp.map(s.groupby(grp).max().cumsum().shift(fill_value=0))).tolist()

вне

[2, 4, 6, 8, 10, 12, 14, 16, 18, 48, 78, 108, 138]