Извлечь все n-элементные последовательности из списка - PullRequest
0 голосов
/ 02 февраля 2019

Как извлечь все n-элементные последовательности из списка?Пример:

a = [0,1,2,3,4]
assert f(a,1) == [[0],[1],[2],[3],[4]]
assert f(a,2) == [[0,1],[1,2],[2,3],[3,4]]
assert f(a,3) == [[0,1,2],[1,2,3],[2,3,4]]
assert f(a,4) == [[0,1,2,3],[1,2,3,4]]
assert f(a,5) == [[0,1,2,3,4]]

Какая самая быстрая реализация f?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Звучит как классическое zip использование

def f(a, n):
    return list(zip(*[a[i:] for i in range(n)]))
0 голосов
/ 02 февраля 2019

Вот способ, которым вы могли бы сделать это, используя функцию генератора , которая будет yield последовательно вырезать из списка, пока не останется ни одной требуемой длины:

def f(x, k, i = 0):
    while len(x[i : i+k]) == k:
        yield x[i : i+k]
        i += 1

Использование

a = [0,1,2,3,4]

list(f(a, 1))
#[[0], [1], [2], [3], [4]]

list(f(a, 2))
#[[0, 1], [1, 2], [2, 3], [3, 4]]

list(f(a, 3))
#[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...