簡體   English   中英

查找序列中所有長度為 n 的連續子序列

[英]Find all consecutive sub-sequences of length n in a sequence

我想在一個序列中找到所有長度為 n 的連續子序列。

例如說 n 是 3 並且序列是:

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

我想要一個 function,它會產生 output:

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

提前致謝!

>>> 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(...))

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

以下可能適合您:

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

獲取僅來自長度 n 的名為“xs”的列表的序列:

[xs[i:j+1] for i, _ in enumerate(xs) for j, _ in enumerate(xs) if len(xs[i:j+1]) == n]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM