Pour python 3.x, les utilisateurs peuvent utiliser
list(map(list, zip(*l)))
Attention: si l est pas de taille égale (par exemple, certaines lignes sont plus courtes que d'autres), zip sera pas compenser et au lieu de hacher l'écart des lignes de la sortie. Donc l=[[1,2],[3,4],[5]] vous donne [[1,3,5]].
Le itertools fonction zip_longest() fonctionne avec des listes. Voir DOCS
Une explication en réponse serait sympa 🙂
Je pense que même list(zip(*l)) fonctionne correctement en Python 3.
Il fonctionne (comme le fait zip(*l) en Python 2), mais vous obtenez une liste de tuples, pas une liste de listes. Bien sûr, list(list(it)) est toujours la même chose que list(it).
L'amour de votre seconde -- je ne savais pas map ne pourrait le faire. Ici un peu de raffinement qui ne nécessite pas de 2 appels, si: map(lambda *a: list(a), *l)
Shouldnt de ce être une meilleure réponse, car il prend soin de l'inégale des listes?
map(None, ...) ne semble pas fonctionner pour Py3. Le générateur est créé mais next() soulève immédiatement une erreur: TypeError: 'NoneType' object is not callable.
juste pour le fun, valide les rectangles et en supposant que m[0] existe
>>> m =[[1,2,3],[4,5,6],[7,8,9]]>>>[[row[i]for row in m]for i in range(len(m[0]))][[1,4,7],[2,5,8],[3,6,9]]
c'est ce que je cherchais, et je ne pouvais pas obtenir ma tête autour de. Encore @jena la solution est vraiment court
Ouais, il a fallu un peu de pneus pour obtenir ce droit. Ok, beaucoup d'essais.
N'est pas encore tout à fait à droite -- cela ne se produit que de travailler lorsque les dimensions sont en place! Il doit être: [[j[i] for j in l] for i in range(len(l[0]))]. Bien sûr, vous devez être sûr que la liste l n'est pas vide.
ne fonctionne toujours pas pour moi de jena exemple l=[[1,2],[3,4],[5]]
C'était badp exemple, de répondre à iéna. Cependant, je ne suis pas sûr que cela fait sens pour moi. OMI, la transposition implique une matrice rectangulaire -- quand représenté par une liste de listes, cela signifie que toutes les listes doivent être de la même longueur. Quel résultat voulez-vous que la "transposition" de cet exemple?
Je vous entends, mais la transposition d'une matrice creuse doit être la même que la transposition d'une matrice (ou l'enveloppe rectangulaire de la matrice). Les trous doivent rester des trous, ou de les remplir avec NaNs, si nécessaire pour maintenir le faible niveau de la structure de données. Si le raccourci de la ligne pour la badp l'exemple de l'été au milieu à la place de la fin, vous auriez à utiliser NaNs pour maintenir la séquence de séquences de structure de données, mais pas si vous avez converti en quelque chose qui permet sparesness (comme un dict de dicts ou scipy.sparse de la matrice).
peut-être que vous pourriez pad de votre matrice avec Nones ou NaNs de sorte que de jena approche serait de travailler.
matchew s'il vous Plaît changer que len(l) à len(l[0]) comme @LeeD suggère.
Les deux premières méthodes de travail en Python 2 ou 3, et ils travaillent sur des "lambeaux" rectangulaire 2D listes. C'est, à l'intérieur des listes n'avez pas besoin d'avoir la même longueur. Les autres méthodes, bien, c'est compliqué.
l'installation
import itertools
import six
list_list =[[1,2,3],[4,5,6,6.1,6.2,6.3],[7,8,9]]
La valeur par défaut fillvalue est None. Grâce à @de jena réponse, où map() est en train de changer l'intérieur de n-uplets de listes. Ici, c'est de tourner les itérateurs sur les listes. Grâce à @Origan et @badp de commentaires.
En Python 3, transmettre le résultat à travers list() pour obtenir le même 2D liste que la méthode 2.
méthode 2 — compréhension de liste, zip_longest()
>>>[list(row)for row in six.moves.zip_longest(*list_list, fillvalue='-')][[1,4,7],[2,5,8],[3,6,9],['-',6.1,'-'],['-',6.2,'-'],['-',6.3,'-']]
Extraordinairement compact @SiggyF deuxième alternative travaille avec des lambeaux 2D listes, à la différence de son premier code qui utilise numpy transposer et passe à travers les lambeaux de listes. Mais Aucun n'a à être la valeur de remplissage. (Non, Aucun passé à l'intérieur de la carte() n'est pas la valeur de remplissage. Il n'y a pas de fonction pour le processus de chaque colonne. Ils sont juste passés à l'extérieur de la carte() qui convertit à partir des n-uplets de listes.
Quelque part en Python 3, map() cessé de mettre en place avec tous ces abus: le premier paramètre ne peut pas être nul, et en lambeaux les itérateurs sont simplement tronqué à la plus courte. Les autres méthodes encore du travail, car cela s'applique uniquement à l'intérieur de la carte().
Comment sur
Pour python 3.x, les utilisateurs peuvent utiliser
l
est pas de taille égale (par exemple, certaines lignes sont plus courtes que d'autres),zip
sera pas compenser et au lieu de hacher l'écart des lignes de la sortie. Doncl=[[1,2],[3,4],[5]]
vous donne[[1,3,5]]
.itertools
fonctionzip_longest()
fonctionne avec des listes. Voir DOCSlist(zip(*l))
fonctionne correctement en Python 3.zip(*l)
en Python 2), mais vous obtenez une liste de tuples, pas une liste de listes. Bien sûr,list(list(it))
est toujours la même chose quelist(it)
.Une façon de le faire est avec la NumPy transposer. Pour une liste, un:
Ou un autre sans zip:
map
ne pourrait le faire. Ici un peu de raffinement qui ne nécessite pas de 2 appels, si:map(lambda *a: list(a), *l)
map(None, ...)
ne semble pas fonctionner pour Py3. Le générateur est créé maisnext()
soulève immédiatement une erreur:TypeError: 'NoneType' object is not callable
.De manière équivalente à de Jena solution:
map()
, cette solution est celle qui est le plus dans l'esprit Python...juste pour le fun, valide les rectangles et en supposant que m[0] existe
[[j[i] for j in l] for i in range(len(l[0]))]
. Bien sûr, vous devez être sûr que la listel
n'est pas vide.NaN
s, si nécessaire pour maintenir le faible niveau de la structure de données. Si le raccourci de la ligne pour la badp l'exemple de l'été au milieu à la place de la fin, vous auriez à utiliserNaN
s pour maintenir la séquence de séquences de structure de données, mais pas si vous avez converti en quelque chose qui permet sparesness (comme undict
dedict
s ouscipy.sparse
de la matrice).None
s ouNaN
s de sorte que de jena approche serait de travailler.len(l)
àlen(l[0])
comme @LeeD suggère.Les deux premières méthodes de travail en Python 2 ou 3, et ils travaillent sur des "lambeaux" rectangulaire 2D listes. C'est, à l'intérieur des listes n'avez pas besoin d'avoir la même longueur. Les autres méthodes, bien, c'est compliqué.
l'installation
méthode 1 —
map()
,zip_longest()
six.moves.zip_longest()
devientitertools.izip_longest()
en Python 2itertools.zip_longest()
en Python 3La valeur par défaut fillvalue est
None
. Grâce à @de jena réponse, oùmap()
est en train de changer l'intérieur de n-uplets de listes. Ici, c'est de tourner les itérateurs sur les listes. Grâce à @Origan et @badp de commentaires.En Python 3, transmettre le résultat à travers
list()
pour obtenir le même 2D liste que la méthode 2.méthode 2 — compréhension de liste,
zip_longest()
La @inspectorG4dget alternative.
méthode 3 —
map()
demap()
— cassé en Python 3.6Extraordinairement compact @SiggyF deuxième alternative travaille avec des lambeaux 2D listes, à la différence de son premier code qui utilise numpy transposer et passe à travers les lambeaux de listes. Mais Aucun n'a à être la valeur de remplissage. (Non, Aucun passé à l'intérieur de la carte() n'est pas la valeur de remplissage. Il n'y a pas de fonction pour le processus de chaque colonne. Ils sont juste passés à l'extérieur de la carte() qui convertit à partir des n-uplets de listes.
Quelque part en Python 3,
map()
cessé de mettre en place avec tous ces abus: le premier paramètre ne peut pas être nul, et en lambeaux les itérateurs sont simplement tronqué à la plus courte. Les autres méthodes encore du travail, car cela s'applique uniquement à l'intérieur de la carte().méthode 4 —
map()
demap()
revisitéHélas les lambeaux lignes ne deviennent PAS des lambeaux de colonnes en Python 3, ils sont tronqués. Boo hoo progrès.
De choisir entre trois options:
1. Carte avec Zip
2. Compréhension De Liste
3. Pour La Boucle Ajoutant
Et de voir les résultats:
Peut-être pas la solution la plus élégante, mais voici une solution utilisant des boucles while:
Voici une solution pour la transposition d'une liste de listes qui n'est pas nécessairement carrée: