Python是否提供了迭代给定列表L的所有“连续子列表”的方法 - 即L的子列表,其中任何两个连续元素在L中也是连续的 - 或者我应该自己编写?
(例如:如果L = [1,2,3],那么我要迭代的集合是{[1],[2],[3],[1,2],[2,3] ],[1,2,3]}。[1,3]被跳过,因为1和3在L中不连续。)
答案 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]]