2011-07-12 28 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] 
相关问题