【发布时间】:2011-02-01 04:01:51
【问题描述】:
Python 是否提供了一种方法来遍历给定列表 L 的所有“连续子列表” - 即 L 的子列表,其中任意两个连续元素在 L 中也是连续的 - 还是我应该自己编写?
(例如:如果 L = [1, 2, 3],那么我要迭代的集合是 {[1], [2], [3], [1, 2], [2,3 ], [1, 2, 3]}。[1, 3] 被跳过,因为 1 和 3 在 L 中不连续。)
【问题讨论】:
Python 是否提供了一种方法来遍历给定列表 L 的所有“连续子列表” - 即 L 的子列表,其中任意两个连续元素在 L 中也是连续的 - 还是我应该自己编写?
(例如:如果 L = [1, 2, 3],那么我要迭代的集合是 {[1], [2], [3], [1, 2], [2,3 ], [1, 2, 3]}。[1, 3] 被跳过,因为 1 和 3 在 L 中不连续。)
【问题讨论】:
我不认为有一个内置的功能。但手动编码可能不会太难 - 你基本上只是循环从 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)])
【讨论】:
试试这样的:
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]]
【讨论】:
这应该可行:
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]
【讨论】: