2011-07-12 13 views
5

Quiero buscar todas las subsecuencias consecutivas de longitud n en una secuencia.Buscar todas las subsecuencias consecutivas de longitud n en una secuencia

E.g. decir n fue 3 y la secuencia fue:

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

Quiero una función que produciría como salida:

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

Gracias de antemano!

+3

Lo han intentado? Parece ser bastante directo en realidad. Itera y toma una subsecuencia de tamaño n en cada posición. –

Respuesta

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

Si desea que el resultado sea una lista de listas en lugar de la lista de tuplas, utilice map(list, zip(...)).

+0

sí, gracias, probablemente debería haber pensado en eso ... – WillJones

+0

Hermoso. ¿Puede explicarme qué hace el operador * en la función zip? –

+0

Descomprime una lista. Útil si está pasando una lista de argumentos a una función, sin embargo, espera un argumento individual – 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

Para hacer esto general para cualquier tamaño de subsecuencia: '[x [i: i + n] para i en rango (len (x) -n + 1)]' donde 'n' es la longitud deseada de la subsecuencia. –

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

Se usa ike esto:

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

Por supuesto funciona también con las listas:

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

La siguiente probablemente podría ser el juego para usted:

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

O simplemente, para obtener todas las secuencias de una lista na med 'x':

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

Para la obtención de las secuencias de una lista llamada 'x' que son sólo de longitud n:

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