Prenons:
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Le résultat que je recherche est
r = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
et pas
r = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
Très appréciée
Que diriez-vous
map(list, zip(*l))
--> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Pour python 3.x, les utilisateurs peuvent utiliser
list(map(list, zip(*l)))
Explication:
Il y a deux choses que nous devons savoir pour comprendre ce qui se passe:
zip(*iterables)
Cela signifie qu'il zip
attend un nombre arbitraire d'arguments dont chacun doit être itérable. Par exemple zip([1, 2], [3, 4], [5, 6])
.args
, f(*args)
appellera de f
telle sorte que chaque élément dans args
est un argument positionnel distinct de f
.Revenir à l'apport de la question l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
, zip(*l)
serait équivalent à zip([1, 2, 3], [4, 5, 6], [7, 8, 9])
. Le reste s'assure simplement que le résultat est une liste de listes au lieu d'une liste de tuples.
l
n'est pas de taille égale (par exemple, certaines lignes sont plus courtes que d'autres),zip
il ne le compensera pas et découpera les lignes de la sortie.l=[[1,2],[3,4],[5]]
Vous donne donc[[1,3,5]]
.itertools
fonctionzip_longest()
fonctionne avec des listes inégales. Voir DOCSlist(zip(*l))
fonctionne correctement en Python 3.zip(*l)
dans Python 2), mais vous obtenez une liste de tuples, pas une liste de listes. Bien sûr,list(list(it))
c'est toujours la même chose quelist(it)
.Une façon de le faire est avec la transposition NumPy. Pour une liste, un:
Ou un autre sans zip:
la source
map
je pouvais faire ça. Voici un léger raffinement qui ne nécessite pas 2 appels, cependant:map(lambda *a: list(a), *l)
map(None, ...)
ne semble pas fonctionner pour Py3. Le générateur est créé , maisnext()
déclenche une erreur immédiatement:TypeError: 'NoneType' object is not callable
.De manière équivalente à la solution d'Iéna:
la source
map()
, cette solution est celle qui est la plus dans l'esprit Python ...juste pour le plaisir, des rectangles valides et en supposant que m [0] existe
la source
[[j[i] for j in l] for i in range(len(l[0]))]
. Bien sûr, vous devez vous assurer que la listel
n'est pas vide.Les méthodes 1 et 2 fonctionnent en Python 2 ou 3, et elles fonctionnent sur des listes 2D rectangulaires irrégulières . Cela signifie que les listes internes n'ont pas besoin d'avoir les mêmes longueurs les unes par rapport aux autres (irrégulières) ou que les listes externes (rectangulaires). Les autres méthodes, eh bien, c'est compliqué.
La mise en place
méthode 1 -
map()
,zip_longest()
six.moves.zip_longest()
devientitertools.izip_longest()
en Python 2itertools.zip_longest()
en Python 3La valeur de remplissage par défaut est
None
. Merci à la réponse de @ jena , oùmap()
change les tuples internes en listes. Ici, il transforme les itérateurs en listes. Merci aux commentaires de @ Oregano et @ badp .En Python 3, transmettez le résultat
list()
pour obtenir la même liste 2D que la méthode 2.méthode 2 - liste de compréhension,
zip_longest()
L' alternative @ inspectorG4dget .
méthode 3 -
map()
ofmap()
- broken en Python 3.6Cette deuxième alternative extraordinairement compacte @SiggyF fonctionne avec des listes 2D déchiquetées, contrairement à son premier code qui utilise numpy pour transposer et passer à travers des listes déchiquetées. Mais aucun ne doit être la valeur de remplissage. (Non, le Aucun transmis à la carte interne () n'est pas la valeur de remplissage. Cela signifie qu'il n'y a pas de fonction pour traiter chaque colonne. Les colonnes sont simplement transmises à la carte externe () qui les convertit des tuples en listes.
Quelque part dans Python 3, a
map()
cessé de supporter tous ces abus: le premier paramètre ne peut pas être None, et les itérateurs irréguliers sont simplement tronqués au plus court. Les autres méthodes fonctionnent toujours car cela ne s'applique qu'à la carte intérieure ().méthode 4 -
map()
demap()
revisitéHélas, les lignes irrégulières ne deviennent PAS des colonnes irrégulières en Python 3, elles sont juste tronquées. Boo hoo progress.
la source
Trois options au choix:
1. Carte avec Zip
2. Compréhension des listes
3. Pour l'ajout d'une boucle
Et pour voir les résultats:
la source
Peut-être pas la solution la plus élégante, mais voici une solution utilisant des boucles imbriquées while:
la source
la source
more_itertools.unzip()
est facile à lire et fonctionne également avec les générateurs.ou équivalent
la source
Voici une solution pour transposer une liste de listes qui n'est pas forcément carrée:
la source
la source