Mi aplicación GAE recibe varios archivos en la carga (puede ser de 0 a N). Tengo una lista en la lista files_arguments:

files_arguments = self.request.arguments()

Necesito tomar los primeros 5 elementos, procesarlos. Luego tome los siguientes 5 elementos y procese. Y así. El último grupo, por supuesto, puede tener menos de 5 elementos.

¿Cuál debería ser el código para hacerlo? (No usaré files_arguments después de eso, por lo que los elementos se pueden eliminar de la lista una vez procesados)

1
LA_ 31 jul. 2011 a las 18:38

4 respuestas

La mejor respuesta

Aquí está el enfoque de baja tecnología. No tira el último grupo si es más pequeño que n.

n = 5
groups = [files_arguments[i:i + n] for i in range(0, len(files_arguments), n)]
6
FMc 31 jul. 2011 a las 15:10
def pickN( mylist, N=5 ):
    if ( len(mylistl) < N) return mylist
    a = mylist[0:N]
    for _ in range(N): mylist.pop(0)
    return a
1
Jakub M. 31 jul. 2011 a las 17:43

Si desea un iterador que devuelva listas completas y rellenas:

def group(a, n=5, default=None):
  a = iter(a)
  while True: 
     yield [next(a)] + [next(a, default) for i in range(n-1)]

>>> list(group(range(8))
[[0, 1, 2, 3, 4], [5, 6, 7, None, None]]
1
Daniel Patru 19 ago. 2011 a las 05:28

Como dice en la documentación de zip,

El orden de evaluación de izquierda a derecha de los iterables está garantizado. Esto hace posible un modismo para agrupar una serie de datos en grupos de longitud n usando zip(*[iter(s)]*n).

Por lo tanto, los grupos completos son zip(*[iter(files_arguments)]*5) y el grupo corto final (si lo hay) es files_arguments[-len(files_arguments)%5:].

La respuesta de FMc es más simple y más fácil de entender en este caso, pero creo que el modismo zip para agrupar es entretenido, por lo que merece una mención aquí.

3
Community 23 may. 2017 a las 10:27