在一个序列中找到所有长度为n的连续子序列

5

我希望能够在一个序列中找到所有长度为n的连续子序列。

例如,假设n为3,序列为:

[0,1,7,3,4,5,10]

我希望有一个函数能够产生以下输出:
[[0,1,7],[1,7,3],[7,3,4],[3,4,5],[4,5,10]]

提前感谢您!


3
你尝试过什么?其实非常简单。在每个位置迭代并取大小为n的子序列。 - Felix Kling
4个回答

19
>>> x = [0,1,7,3,4,5,10]
>>> n = 3
>>> zip(*(x[i:] for i in range(n)))
[(0, 1, 7), (1, 7, 3), (7, 3, 4), (3, 4, 5), (4, 5, 10)]

如果你想要的结果是一个列表的列表而不是元组的列表,可以使用map(list, zip(...))


很好。你能解释一下 zip 函数中的 * 运算符是什么吗? - Raghavendra Kumar
它可以解包列表。如果您将参数列表传递给函数,但该函数期望单个参数,则此功能非常有用。 - mossplix
我知道评论应该更有建设性,但我只是觉得这很美。 - kevin_theinfinityfund

14
>>> x = [0,1,7,3,4,5,10]
>>> [x[n:n+3] for n in range(len(x)-2)]
[[0, 1, 7], [1, 7, 3], [7, 3, 4], [3, 4, 5], [4, 5, 10]]

6
为了使其适用于任何子序列大小:[x[i:i+n] for i in range(len(x)-n+1)],其中 n 是所需子序列的长度。 - Steven Rumbalski

2
def subseqs(seq, length):
    for i in xrange(len(seq) - length + 1):
        yield seq[i:i+length]

使用方法如下:

>>> for each in subseqs("hello", 3):
...     print each
...
hel
ell
llo

当然,它也适用于列表:
>>> list(subseqs([1, 2, 3, 4, 5, 6, 7, 8], 3))
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8]]

1
以下内容可能适合您:
def subseqs(xs, n):
  all_seqs = (xs[i:j+1] for i, _ in enumerate(xs) for j, _ in enumerate(xs))
  return filter(lambda seq: len(seq) == n, all_seqs)

>>> xs = [1, 2, 3, 4, 5, 6] # can be also range(1, 7) or list(range(1, 7)) 
>>> list(subseqs(xs, 3))
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]

或者,仅需获取名为'xs'的列表的所有序列:

[xs[i:j+1] for i, _ in enumerate(xs) for j, _ in enumerate(xs)]

获取名为'xs'的列表中长度仅为n的序列:
[xs[i:j+1] for i, _ in enumerate(xs) for j, _ in enumerate(xs) if len(xs[i:j+1]) == n]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接