Оптимально составить список из троек, идущих подряд, в последовательности чисел

Дан список чисел [1, 2, 3, 4, 5, 6, 7]

Как оптимально разбить этот список, чтобы получился список с тройками?

triples = [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7]]

У меня вышло вот так, но оптимально ли это, если в списке будет 10000 чисел...

data = [1, 2, 3, 4, 5, 6, 7]

triples = []

for i in range(2, len(data)):
    triples.append([data[i - k] for k in range(2, -1, -1)])

print(triples)

Ответы (3 шт):

Автор решения: Stanislav Volodarskiy

Ваш код не так плох. Его можно улучшить, но не сильно. Например:

triples = [data[i:i + 3] for i in range(len(data) - 2)]

Я использую что-то такое:

def triples(seq):
    it = iter(seq)
    for a in it: break
    for b in it: break
    for c in it:
        yield a, b, c
        a, b = b, c

Последний код более универсальный, он не использует длину массива и обращение по индексу. Тройки можно возвращать из любой последовательности (iterable). Но это сложно, честно говоря.

→ Ссылка
Автор решения: CrazyElf

Если списки внутри не принципиальны, то можно вот так сделать список кортежей:

lst = [1, 2, 3, 4, 5, 6, 7]
triples = list(zip(*(lst[i:] for i in range(3))))
print(triples)
# [(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7)]
→ Ссылка
Автор решения: Alex Alex

Возможно, что оптимально будет использовать не списки, а массивы numpy. Тогда код будет таким:

import numpy as np                

a = np.arange(1, 8)
result = np.lib.stride_tricks.sliding_window_view(a, 3)
→ Ссылка