de una sola línea el retorno de una lista de listas, dada una lista y el tamaño del fragmento:.
>>> lol = lambda lst, sz: [lst[i:i+sz] for i in range(0, len(lst), sz)]
Pruebas:
>>> x = range(20, 36)
>>> print x
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
>>> lol(x, 4)
[[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31],
[32, 33, 34, 35]]
>>> lol(x, 7)
[[20, 21, 22, 23, 24, 25, 26],
[27, 28, 29, 30, 31, 32, 33],
[34, 35]]
Actualización:
Creo que la pregunta está pidiendo realmente es una función que, dada una lista y un número, devuelve una lista que contiene $ (número) listas, con los artículos de la lista original distribuidos uniformemente. Entonces tu ejemplo de lol (x, 7) realmente debería devolver [[20,21,22], [23,24,25], [26,27], [28,29], [30,31], [32] , 33], [34,35]]. - markrian
Pues bien, en este caso, se puede tratar:
def slice_list(input, size):
input_size = len(input)
slice_size = input_size/size
remain = input_size % size
result = []
iterator = iter(input)
for i in range(size):
result.append([])
for j in range(slice_size):
result[i].append(iterator.next())
if remain:
result[i].append(iterator.next())
remain -= 1
return result
Estoy seguro que esto se puede mejorar, pero me siento perezoso.:-)
>>> slice_list(x, 7)
[[20, 21, 22], [23, 24, 25],
[26, 27], [28, 29],
[30, 31], [32, 33],
[34, 35]]
Usted no da los nombres de las piezas. Usted devuelve una lista de listas. – delnan
¿Cómo dividir? '[1,2,3,4,5, ... 100]' se convierte en '[1,2,3, ...], [11,12,13, ...], ...' o ' [1,11,21, ...], [2,12,22, ...], ... 'o al azar o qué? – kennytm
¿Por qué no una tupla u otra lista, que contendrá las sublistas? ¿Y luego recomendar usar la posición? Sería más dinámico que usar variables.
– khachik