Cadena de Python dividida en ventana móvil

Tengo una cadena con dígitos como, por ejemplo, digit = "7316717"

Ahora quiero dividir la cadena de tal manera que la salida sea una ventana móvil de 3 dígitos a la vez. Así que tengo …

["731", "316", "167", "671", "717"]

¿Cómo sería el enfoque? Una forma sencilla es poner en bucle for y iterar. Pero siento que alguna función de cadena Python incorporada puede hacer esto en menos código. ¿Sabes de tal enfoque?

Los ejemplos de itertools proporcionan la función de window que hace precisamente eso:

 from itertools import islice def window(seq, n=2): "Returns a sliding window (of width n) over data from the iterable" " s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ... " it = iter(seq) result = tuple(islice(it, n)) if len(result) == n: yield result for elem in it: result = result[1:] + (elem,) yield result 

Ejemplo de uso:

 >>> ["".join(x) for x in window("7316717", 3)] ['731', '316', '167', '671', '717'] 
 >>> s = "7316717" >>> [s[i:i+3] for i in range(len(s)-2)] ['731', '316', '167', '671', '717'] 

Hay una muy buena receta por pairwise en los documentos de itertools .

Modernizándolo un poco para n elementos en el grupo, hice este código:

 from itertools import tee, izip def window(iterable, n): els = tee(iterable, n) for i, el in enumerate(els): for _ in xrange(i): next(el, None) return izip(*els) print(["".join(i) for i in window("2316515618", 3)]) 

Python 2.7

 digit = "7316717" digit_sets = [digit[i:i+3] for i in range(len(digit)-2)]