Lass uns nehmen:
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Das Ergebnis, das ich suche, ist
r = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
und nicht
r = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
Sehr geschätzt
Wie wäre es mit
map(list, zip(*l))
--> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Für Python 3.x können Benutzer verwenden
list(map(list, zip(*l)))
Erläuterung:
Es gibt zwei Dinge, die wir wissen müssen, um zu verstehen, was los ist:
zip(*iterables)
Dies bedeutet, zip
dass eine beliebige Anzahl von Argumenten erwartet wird, von denen jedes iterierbar sein muss. ZB zip([1, 2], [3, 4], [5, 6])
.args
, f(*args)
rufen , f
so dass jedes Element in args
einem getrenntes Positions Argument f
.Auf die Eingabe aus der Frage zurückzukommen l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
, zip(*l)
wäre gleichbedeutend mit zip([1, 2, 3], [4, 5, 6], [7, 8, 9])
. Der Rest stellt nur sicher, dass das Ergebnis eine Liste von Listen anstelle einer Liste von Tupeln ist.
l
Größe nicht gleichmäßig ist (z. B. sind einige Zeilen kürzer als andere),zip
wird dies nicht kompensiert und stattdessen werden Zeilen aus der Ausgabe entfernt. Sol=[[1,2],[3,4],[5]]
gibt es dir[[1,3,5]]
.itertools
Funktionzip_longest()
arbeitet mit ungeraden Listen. Siehe DOCSlist(zip(*l))
funktioniert sogar richtig in Python 3.zip(*l)
in Python 2), aber Sie erhalten eine Liste von Tupeln, keine Liste von Listen. Natürlichlist(list(it))
ist immer das Gleiche wielist(it)
.Eine Möglichkeit ist die NumPy-Transponierung. Für eine Liste gilt Folgendes:
Oder eine andere ohne Reißverschluss:
quelle
map
dass ich das tun kann. Hier ist eine leichte Verfeinerung, die jedoch keine zwei Anrufe erfordert:map(lambda *a: list(a), *l)
map(None, ...)
scheint nicht für Py3 zu funktionieren. Der Generator wird erstellt,next()
löst jedoch sofort einen Fehler aus :TypeError: 'NoneType' object is not callable
.Entsprechend Jenas Lösung:
quelle
map()
ist diese Lösung diejenige, die am meisten im Python-Geist ist ...Nur zum Spaß, gültige Rechtecke und unter der Annahme, dass m [0] existiert
quelle
[[j[i] for j in l] for i in range(len(l[0]))]
. Natürlich müssen Sie sicherstellen, dass die Listel
nicht leer ist.Die Methoden 1 und 2 funktionieren in Python 2 oder 3 und in unregelmäßigen, rechteckigen 2D-Listen. Das bedeutet, dass die inneren Listen nicht die gleiche Länge haben müssen (zackig) oder wie die äußeren Listen (rechteckig). Die anderen Methoden sind kompliziert.
die Einrichtung
Methode 1 -
map()
,zip_longest()
six.moves.zip_longest()
wirditertools.izip_longest()
in Python 2itertools.zip_longest()
in Python 3Der Standardfüllwert ist
None
. Dank der Antwort von @ jena , womap()
die inneren Tupel in Listen geändert werden. Hier werden Iteratoren in Listen umgewandelt. Vielen Dank an die Kommentare von @ Oregano und @ badp .Übergeben Sie in Python 3 das Ergebnis
list()
, um dieselbe 2D-Liste wie in Methode 2 zu erhalten.Methode 2 - Listenverständnis,
zip_longest()
Die @ inspectorG4dget-Alternative .
Methode 3 -
map()
ofmap()
- in Python 3.6 gebrochenDiese außerordentlich kompakte zweite Alternative von @SiggyF funktioniert mit zerlumpten 2D-Listen, im Gegensatz zu seinem ersten Code, der numpy verwendet, um zerlumpte Listen zu transponieren und zu durchlaufen. Aber keiner muss der Füllwert sein. (Nein, das an die innere Map () übergebene None ist nicht der Füllwert. Dies bedeutet, dass keine Funktion zum Verarbeiten jeder Spalte vorhanden ist. Die Spalten werden nur an die äußere Map () übergeben, die sie von Tupeln in Listen konvertiert.
Irgendwo in Python 3 wurde
map()
dieser Missbrauch nicht mehr ertragen: Der erste Parameter kann nicht None sein, und zerlumpte Iteratoren werden nur auf die kürzeste Zeit abgeschnitten. Die anderen Methoden funktionieren weiterhin, da dies nur für die innere Map () gilt.Methode 4 -
map()
vonmap()
überarbeitetLeider werden die unregelmäßigen Zeilen in Python 3 NICHT zu unregelmäßigen Spalten, sondern nur abgeschnitten. Boo hoo Fortschritt.
quelle
Drei Optionen zur Auswahl:
1. Karte mit Zip
2. Listenverständnis
3. Zum Anhängen einer Schleife
Und um die Ergebnisse anzuzeigen:
quelle
Vielleicht nicht die eleganteste Lösung, aber hier ist eine Lösung mit verschachtelten while-Schleifen:
quelle
quelle
more_itertools.unzip()
ist leicht zu lesen und funktioniert auch mit Generatoren.oder gleichwertig
quelle
Hier ist eine Lösung zum Transponieren einer Liste von Listen, die nicht unbedingt quadratisch ist:
quelle
quelle