我从内到外经历过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]))
已接近,但并不完全符合我的希望
答案 0 :(得分:14)
使用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
的代码,您可以将其改写为(在Python 2上不需要list
包装器):
from itertools import combinations, starmap
y = list(map(x.__getitem__, starmap(slice, combinations(range(len(x)+1), 2))))
得到相同的结果,但每个项目没有任何Python字节码执行,可能运行得更快(取决于实现)。
答案 1 :(得分:5)
如果你坚持单行,你可以利用列表理解:
> 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],[1,2],[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))]
答案 2 :(得分:1)
你可以试试这个:
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]]
答案 3 :(得分:0)
我认为这是一种很好的方法,一种反复的方式,我能理解它:
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])