Echemos:
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
El resultado que estoy buscando es
r = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
y no
r = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
Muy apreciado
Qué tal si
map(list, zip(*l))
--> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Para python 3.x los usuarios pueden usar
list(map(list, zip(*l)))
Explicación:
Hay dos cosas que necesitamos saber para entender lo que está sucediendo:
zip(*iterables)
Esto significa que zip
espera un número arbitrario de argumentos, cada uno de los cuales debe ser iterable. Por ej zip([1, 2], [3, 4], [5, 6])
.args
, f(*args)
llamará de f
tal manera que cada elemento en args
sea un argumento posicional separado de f
.Volviendo a la entrada de la pregunta l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
, zip(*l)
sería equivalente a zip([1, 2, 3], [4, 5, 6], [7, 8, 9])
. El resto es solo asegurarse de que el resultado sea una lista de listas en lugar de una lista de tuplas.
l
no está dimensionado de manera uniforme (por ejemplo, algunas filas son más cortas que otros),zip
será no compensar por ello y en lugar de cortar distancia filas de la salida. Entoncesl=[[1,2],[3,4],[5]]
te da[[1,3,5]]
.itertools
funciónzip_longest()
funciona con listas desiguales. Ver DOCSlist(zip(*l))
funciona correctamente en Python 3.zip(*l)
en Python 2), pero obtienes una lista de tuplas, no una lista de listas. Por supuesto,list(list(it))
siempre es lo mismo quelist(it)
.Una forma de hacerlo es con la transposición NumPy. Para una lista, un:
U otro sin cremallera:
fuente
map
podía hacer eso. Sin embargo, aquí hay un ligero refinamiento que no requiere 2 llamadas:map(lambda *a: list(a), *l)
map(None, ...)
no parece funcionar para Py3. El generador se crea, peronext()
genera un error de inmediato:TypeError: 'NoneType' object is not callable
.Equivalente a la solución de Jena:
fuente
map()
, esta solución es la que tiene más espíritu Python ...solo por diversión, rectángulos válidos y suponiendo que m [0] existe
fuente
[[j[i] for j in l] for i in range(len(l[0]))]
. Por supuesto, debe asegurarse de que la listal
no esté vacía.Los métodos 1 y 2 funcionan en Python 2 o 3, y funcionan en irregular, rectangular listas 2D. Eso significa que las listas internas no necesitan tener las mismas longitudes entre sí (desiguales) o que las listas externas (rectangulares). Los otros métodos, bueno, son complicados.
la puesta en marcha
método 1 -
map()
,zip_longest()
six.moves.zip_longest()
se convierteitertools.izip_longest()
en Python 2itertools.zip_longest()
en Python 3El valor de relleno predeterminado es
None
. Gracias a la respuesta de @ jena , ¿dóndemap()
está cambiando las tuplas internas a listas? Aquí está convirtiendo iteradores en listas. Gracias a los comentarios de @ Oregano y @ badp .En Python 3, pase el resultado
list()
para obtener la misma lista 2D que el método 2.método 2 - comprensión de la lista,
zip_longest()
La alternativa @ inspectorG4dget .
método 3 -
map()
demap()
- roto en Python 3.6Esta segunda alternativa extraordinariamente compacta de @SiggyF funciona con listas 2D irregulares, a diferencia de su primer código que usa numpy para transponer y pasar por listas irregulares. Pero Ninguno tiene que ser el valor de relleno. (No, el Ninguno pasado al mapa interno () no es el valor de relleno. Significa que no hay ninguna función para procesar cada columna. Las columnas simplemente se pasan al mapa externo () que las convierte de tuplas a listas.
En algún lugar de Python 3,
map()
dejé de soportar todo este abuso: el primer parámetro no puede ser None, y los iteradores irregulares se truncan al más corto. Los otros métodos aún funcionan porque esto solo se aplica al mapa interno ().método 4 -
map()
demap()
revisitadoPor desgracia, las filas irregulares NO se convierten en columnas irregulares en Python 3, solo se truncan. Boo hoo progreso.
fuente
Tres opciones para elegir:
1. Mapa con Zip
2. Lista de comprensión
3. Para anexar bucles
Y para ver los resultados:
fuente
Quizás no sea la solución más elegante, pero aquí hay una solución que usa bucles while anidados:
fuente
fuente
more_itertools.unzip()
es fácil de leer y también funciona con generadores.o equivalente
fuente
Aquí hay una solución para transponer una lista de listas que no es necesariamente cuadrada:
fuente
fuente