Оптимально составить список из троек, идущих подряд, в последовательности чисел
Дан список чисел [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 шт):
Ваш код не так плох. Его можно улучшить, но не сильно. Например:
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). Но это сложно, честно говоря.
Если списки внутри не принципиальны, то можно вот так сделать список кортежей:
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)]
Возможно, что оптимально будет использовать не списки, а массивы numpy. Тогда код будет таким:
import numpy as np
a = np.arange(1, 8)
result = np.lib.stride_tricks.sliding_window_view(a, 3)