获取列表的每个片段

时间:2017-10-25 20:27:22

标签: python

我从内到外经历过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]))已接近,但并不完全符合我的希望

4 个答案:

答案 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])