在Python中迭代连续子列表

0 投票
3 回答
2542 浏览
提问于 2025-04-15 20:53

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]]

撰写回答