convertir una lista plana a la lista de listas en python

Normalmente, usted quiere ir al revés, como aquí . Me preguntaba cómo se puede convertir una lista plana en una lista de la lista, matriz de remodelación cuasy en python

En numpy podrías hacer algo como:

>>> a=numpy.aranage(9) >>> a.reshape(3,3) >>> a array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) 

Me preguntaba cómo haces lo contrario, y mi solución habitual es algo así como:

 >>> Mylist ['a', 'b', 'c', 'd', 'e', 'f'] >>> newList = [] for i in range(0,len(Mylist),2): ... newList.append(Mylist[i], Mylist[i+1]) >>> newList [['a', 'b'], ['c', 'd'], ['e', 'f']] 

¿Hay alguna forma más “pythonica” de hacerlo?

 >>> l = ['a', 'b', 'c', 'd', 'e', 'f'] >>> zip(*[iter(l)]*2) [('a', 'b'), ('c', 'd'), ('e', 'f')] 

Como lo señaló @Lattyware, esto solo funciona si hay suficientes elementos en cada argumento de la función zip cada vez que devuelve una tupla. Si uno de los parámetros tiene menos elementos que los otros, los elementos se eliminan, por ejemplo.

 >>> l = ['a', 'b', 'c', 'd', 'e', 'f','g'] >>> zip(*[iter(l)]*2) [('a', 'b'), ('c', 'd'), ('e', 'f')] 

Si este es el caso, entonces es mejor usar la solución de @Sven Marnach

¿Cómo funciona zip(*[iter(s)]*n)

Esto generalmente se hace usando la receta de mero de la documentación de itertools :

 def grouper(n, iterable, fillvalue=None): "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" args = [iter(iterable)] * n return itertools.izip_longest(fillvalue=fillvalue, *args) 

Ejemplo:

 >>> my_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] >>> list(grouper(2, my_list)) [('a', 'b'), ('c', 'd'), ('e', 'f'), ('g', None)] 

Otra forma de crear una lista de listas se puede simplificar como se muestra a continuación:

 >>>MyList = ['a','b','c','d','e','f'] # Calculate desired row/col >>>row = 3 >>>col = 2 >>>NewList = [MyList[col*i : col*(i+1)] for i in range(row)] >>>NewList [['a', 'b', 'c'], ['d', 'e', 'f']] 

Este método puede extenderse para producir cualquier tamaño de fila y columna. Si selecciona valores de fila y columna tales que row*col >len(MyList) , la sublista (fila) que contiene el último valor en MyList terminará allí, y NewList simplemente se llenará con el número apropiado de listas vacías para satisfacer la fila / especificaciones col

 >>>MyList = ['a','b','c','d','e','f','g','h'] >>>row = 3 >>>col = 3 >>>NewList = [MyList[col*i : col*(i+1)] for i in range(row)] >>>NewList [['a', 'b', 'c'], ['d', 'e', 'f'], ['g','h']] >>>row = 4 >>>col = 4 >>>NewList = [MyList[col*i : col*(i+1)] for i in range(row)] [['a', 'b', 'c', 'd'], ['e', 'f', 'g','h'], [], []] 

Si uno prefiere una lista de listas, en lugar de una lista de tuplas de una lista plana, entonces puede hacer esto:

  a = range(20) # sample starting list b = [] # new list c = [] # alternate new list # ny is length of new list. nx length of each list within it nx = 5; ny = 4 bb = 0; ee = bb + nx # option one: sliding indeces for slices. for ii in range(ny-1): bb += nx ee += nx b.append(a[bb:ee]) c.append(a[slice(ii*nx,nx*(ii+1))]) # option two, use slice() 

(He jugado un poco con la reducción de todo el bucle for en una línea con comprensión de lista, pero no he tenido éxito. De la forma en que lo he usado, slice () casi puede llevarlo allí). Una posible ventaja de estos enfoques sobre los otros mencionados son que si su lista plana original no es un múltiplo par de las dimensiones de su nueva lista de listas deseada, no perderá ningún dato. La advertencia es que la última lista será más corta que todas las demás, ya que contendrá las “sobras”. concedido, ninguno de estos métodos me parece muy pythonico.