2011-07-12 29 views
5

我想查找序列中長度爲n的所有連續子序列。查找序列中長度爲n的所有連續子序列

E.g.說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的子序列。 –

回答

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

+0

是的,謝謝你應該想到的那個... – WillJones

+0

美麗。你能解釋一下zip函數中的*操作符嗎? –

+0

它解包一個列表。有用的,如果你傳遞一個參數列表給一個函數,但它期望一個單獨的參數 – mossplix

12
>>> 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]] 
+4

爲了使任何子序列的大小爲一般:'[x [i:i + n]爲範圍內的我(len(x)-n + 1)]'其中'n'是子序列的期望長度。 –

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

使用它IKE在此:

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

或者乾脆,爲了獲得列表na的所有序列MED '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] 
相關問題