necesito un algoritmo que da una lista L
y un número N
, devuelve una lista de N
listas más pequeñas, donde las sublistas son "equilibrada". Ejemplos:Splitting una lista en partes de longitudes equilibradas
algo(range(1, 8), 3) -> [[1,2,3], [4,5], [6,7]]
algo(range(1, 6), 4) -> [[1,2], [3], [4], [5]]
algo(range(1, 12), 5) -> [[1,2,3], [4,5], [6,7], [8,9], [10, 11]]
Como puede ver, el algoritmo debe "preferir" la primera lista en la salida.
He estado intentando durante horas, pero no puedo encontrar un algoritmo bueno y concisa para ello. Esto se implementará en Python, por cierto, pero en realidad es el algoritmo que busco aquí. Esta es no deberes, esto es para un sitio web que mostrará los contenidos en una lista en tres columnas (Django).
Me dio la mejor respuesta entre #python en freenode y es de la siguiente manera:
def split_up(l, n):
q, r = divmod(len(l), n)
def division_point(i):
return i * q + min(i, r)
return [l[division_point(i):division_point(i+1)] for i in range(n)]
No me preguntes por qué funciona sin embargo. :) Sin embargo, daré la respuesta correcta al que tenga más votos.
Tienes que ordenar de antemano si estoy pensando bien. ¿Qué está mal con lst.sort(), luego trazarlo linealmente para eliminar elementos? Es O ([the sort func]) de todos modos. – u0b34a0f6ae
http: // stackoverflow.com/questions/320170/how-do-i-divide-an-ordered-list-of-integers-into-even-sized-sublists –
@Corey D: esa pregunta es * ligeramente * diferente – voyager