Получение каждого фрагмента списка

Я прошел через itertools внутри и снаружи, и я не могу понять, как это сделать. Я хочу взять список.

x = [1,2,3,4,5,6,7,8], и я хочу получить новый список:

y = [[1],[1,2],[1,2,3],.......[2],[2,3],[2,3,4].....[8]]

Мне нужен список всех срезов, но не комбинаций или перестановок.

x = list(zip(x[::2], x[1::2])) близок, но не делает точно, что я надеюсь

Ответы

Ответ 1

Используйте combinations не для x, а для range возможных индексов среза (включая один конец, таким образом len(x)+1, поскольку срезы являются исключительными на конце), чтобы сделать конечные точки среза, затем используйте их для среза x:

from itertools import combinations

y = [x[s:e] for s, e in combinations(range(len(x)+1), 2)]

Это именно то, что вы делаете как можно более прямолинейно. Если вы хотите (возможно) быстрее map на основе кода, вы можете перефразировать его как (list обертка, ненужная на Python 2):

from itertools import combinations, starmap

y = list(map(x.__getitem__, starmap(slice, combinations(range(len(x)+1), 2))))

который получает тот же результат, но без какого-либо исполнения байт-кода Python за элемент, который может работать быстрее (зависит от реализации).

Ответ 2

Вы можете использовать понимание списка, если настаиваете на использовании одного слоя:

> x=[1,2,3,4]
> [x[a:b+1] for a in range(len(x)) for b in range(len(x)) if a<=b]
[1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [ [3], [3, 4], [4]]

Или вы даже можете избавиться от этого if:

> [x[a:b+1] for a in range(len(x)) for b in range(a, len(x))]

Ответ 3

Вы можете попробовать следующее:

x = [1,2,3,4,5,6,7,8]
y = [x[b:i+1] for b in range(len(x)) for i in range(len(x))]
final_list = list(filter(lambda x:x, y))

Вывод:

[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 6, 7, 8], [2], [2, 3], [2, 3, 4], [2, 3, 4, 5], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 5, 6, 7, 8], [3], [3, 4], [3, 4, 5], [3, 4, 5, 6], [3, 4, 5, 6, 7], [3, 4, 5, 6, 7, 8], [4], [4, 5], [4, 5, 6], [4, 5, 6, 7], [4, 5, 6, 7, 8], [5], [5, 6], [5, 6, 7], [5, 6, 7, 8], [6], [6, 7], [6, 7, 8], [7], [7, 8], [8]]

Ответ 4

Я думаю, что это хороший подход, итеративный способ, я мог бы понять это хорошо:

lst = [1,2,3,4,5,6,7,8]

res = []
ln= len(lst)


for n in range(ln):
  for ind in range(n+1, ln+1):
    res.append(lst[n:ind])