Получение каждого фрагмента списка
Я прошел через 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])