¿Cómo dividir cada n º elemento en el índice usando python?

Esto podría parecer una pregunta simple, pero no pude encontrar la solución.

Suponiendo que tengo esta lista

my_list = [1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99] 

Estoy intentando dividir el elemento en esta lista e incrementarlo por índice. En definitiva, quiero obtener el resultado de esta manera.

 [1, 2, 3] [2, 3, 4] [3, 4, 5] [4, 5, 6] [5, 6, 7] [6, 7, 8] [7, 8, 9] [8, 9, 11] [9, 11, 22] [11, 22, 33] [22, 33, 44] [33, 44, 55] [44, 55, 66] [55, 66, 77] [66, 77, 88] [77, 88, 99] 

Pero lo que tengo es así.

 [1, 2, 3] [2, 3, 4] [3, 4, 5] [4, 5, 6] [5, 6, 7] [6, 7, 8] [7, 8, 9] [8, 9, 11] [9, 11, 22] [11, 22, 33] [22, 33, 44] [33, 44, 55] [44, 55, 66] [55, 66, 77] [66, 77, 88] [77, 88, 99] [88, 99] [99] 

Quiero my_list en varios conjuntos más pequeños, cada uno con una longitud de 3. Pero el resultado que obtuve también incluyó la lista que tiene una longitud inferior a 3.

Este es el script de python que uso

 my_list = [1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99] m = 0 def incr(): global m for n in range(len(my_list)): if n < len(my_list): n = m + 3 new_list = my_list[m:n] print new_list m+=1 else: pass incr() 

Pensé que podría agregar if len(new_list) < 3 pero no estoy muy seguro de cómo debo modificar el script para eso.

Gracias por tu ayuda.

 [my_list[i:i+3] for i in range(len(my_list)-2)] 

Pequeña explicación:

  • Usé listas de comprensión

  • El número de elementos que tiene la lista resultante es len(my_list)-2)

  • Cada elemento del resultado se crea dividiendo tres elementos consecutivos de la lista original [i:i+3]

  • i en 0 para obtener el primer elemento de la lista de resultados y luego cambiar una posición (que se incrementa en uno) para obtener el segundo elemento y así sucesivamente.

Desea iterar en trozos, con una superposición. Es un requisito común y en muchas aplicaciones se denomina ventana móvil . Puedes usar tee de itertools:

 >>> def thinger(iterable, n=3): ... iterators = tee(iterable, n) ... for i, iterator in enumerate(iterators): ... for skip in range(i): ... next(iterator, None) ... return zip(*iterators) ... >>> list(thinger([1,2,3,4,5,6])) [(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)] >>> list(thinger([1,2,3,4,5,6], n=4)) [(1, 2, 3, 4), (2, 3, 4, 5), (3, 4, 5, 6)] 

La zip realidad devuelve tuplas, lo que probablemente no sea un problema si está tipeando pato, pero puede convertirlas a listas si es necesario:

 >>> [list(x) for x in thinger([1,2,3], n=2)] [[1, 2], [2, 3]] 
 my_list = [1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99] def temp(lst,no): result = [] for i in range(len(lst)-no+1): result.append(lst[i:i+no]) return result print temp(my_list,3) print temp(my_list,4) 

Salida

 [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 11], [9, 11, 22], [11, 22, 33], [22, 33, 44], [33, 44, 55], [44, 55, 66], [55, 66, 77], [66, 77, 88], [77, 88, 99]] [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7], [5, 6, 7, 8], [6, 7, 8, 9], [7, 8, 9, 11], [8, 9, 11, 22], [9, 11, 22, 33], [11, 22, 33, 44], [22, 33, 44, 55], [33, 44, 55, 66], [44, 55, 66, 77], [55, 66, 77, 88], [66, 77, 88, 99]] 

Me gusta esto:

 my_list = [1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99] m = 0 def incr(): global m for n in range(len(my_list)): if n+3 <= len(my_list): n = m + 3 new_list = my_list[m:n] print new_list m +=1 else: pass incr()