在Python中迭代连续子列表
Python有没有办法可以遍历一个列表L的所有“连续子列表”?也就是说,子列表中的任何两个相邻元素在L中也是相邻的,还是我需要自己写一个?
(举个例子:如果L = [1, 2, 3],那么我想遍历的集合是{[1], [2], [3], [1, 2], [2, 3], [1, 2, 3]}。像[1, 3]这样的组合就不算,因为1和3在L中不是相邻的。)
3 个回答
1
这个应该可以用:
def sublists(lst):
for sublen in xrange(1,len(lst)+1):
for idx in xrange(0,len(lst)-sublen+1):
yield lst[idx:idx+sublen]
2
我觉得没有现成的功能可以做到这一点;不过手动写一个也不是太难——其实就是遍历所有可能的长度,从1到L.length,然后提取每个长度的所有子字符串。
你可以使用 itertools.chain()
来把每个长度的子字符串序列合并成一个生成器,这样就能得到所有的子字符串了。
举个例子:
>>> a = [1,2,3,4]
>>> list(
... itertools.chain(
... *[[a[i:i+q] for q in xrange(1,len(a)-i+1)] for i in xrange(len(a))]
... )
... )
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
如果你想要按照你描述的那种先按长度递增,然后再按字典顺序排列的方式,你可以这样做:
itertools.chain(*[[a[q:i+q] for q in xrange(len(a)-i+1)] for i in xrange(1,len(a)+1)])
1
试试这样做:
def iter_sublists(l):
n = len(l)+1
for i in xrange(n):
for j in xrange(i+1, n):
yield l[i:j]
>>> print list(iter_sublists([1,2,3]))
[[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]