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
.