迭代Python中的连续子列表

时间:2010-03-26 12:39:08

标签: python iterator

Python是否提供了迭代给定列表L的所有“连续子列表”的方法 - 即L的子列表,其中任何两个连续元素在L中也是连续的 - 或者我应该自己编写?

(例如:如果L = [1,2,3],那么我要迭代的集合是{[1],[2],[3],[1,2],[2,3] ],[1,2,3]}。[1,3]被跳过,因为1和3在L中不连续。)

3 个答案:

答案 0 :(得分:2)

我不认为有这样的内置;但是手动编码可能不会太难 - 你基本上只是循环遍历从1到L长度的所有可能长度,然后获取每个长度的所有子串。

你可以使用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 :(得分: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)

尝试这样的事情:

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