¿Cómo puedo transponer una lista?

Digamos que tengo una sola lista [[1,2,3],[4,5,6]]

¿Cómo los transpongo para que sean: [[1, 4], [2, 5], [3, 6]] ?

¿Tengo que usar la función zip ? ¿Es la función zip la forma más fácil?

 def m_transpose(m): trans = zip(m) return trans 

Usar zip y *splat es la forma más fácil en Python puro.

 >>> list_ = [[1,2,3],[4,5,6]] >>> zip(*list_) [(1, 4), (2, 5), (3, 6)] 

Tenga en cuenta que obtiene tuplas en lugar de listas. Si necesita las listas, use map(list, zip(*l)) .

Si está abierto a usar numpy lugar de una lista de listas, entonces usar el atributo .T es aún más fácil:

 >>> import numpy as np >>> a = np.array([[1,2,3],[4,5,6]]) >>> print(*a) [1 2 3] [4 5 6] >>> print(*aT) [1 4] [2 5] [3 6] 

Puedes usar map with None como el primer parámetro:

 >>> li=[[1,2,3],[4,5,6]] >>> map(None, *li) [(1, 4), (2, 5), (3, 6)] 

A diferencia de zip funciona en listas desiguales:

 >>> li=[[1,2,3],[4,5,6,7]] >>> map(None, *li) [(1, 4), (2, 5), (3, 6), (None, 7)] >>> zip(*li) [(1, 4), (2, 5), (3, 6)] # ^^ 7 missing... 

Luego, vuelva a llamar a map con list como primer parámetro si desea que los subelementos sean listas en lugar de tuplas:

 >>> map(list, map(None, *li)) [[1, 4], [2, 5], [3, 6]] 

(Nota: el uso del mapa con None para transponer una matriz no se admite en Python 3.x. Use zip_longest de itertools para obtener la misma funcionalidad …)

zip() no parece hacer lo que querías, usando zip() obtienes una list de tuples . Esto debería funcionar sin embargo:

 >>> new_list = [] >>> old_list = [[1,2,3],[4,5,6]] >>> for index in range(len(old_list[0])): ... new_list.append([old_list[0][index], old_list[1][index]]) ... >>> new_list [[1, 4], [2, 5], [3, 6]] 

La forma exacta de usar zip() y obtener lo que desea es:

 >>> l = [[1,2,3],[4,5,6]] >>> [list(x) for x in zip(*l)] >>> [[1, 4], [2, 5], [3, 6]] 

Este código usa la palabra clave de la list para convertir las tuples devueltas por zip en lists .