Ich versuche zu lernen, wie man Listen "zippt". Zu diesem Zweck habe ich ein Programm, in dem ich an einem bestimmten Punkt Folgendes mache:
x1, x2, x3 = stuff.calculations(withdataa)
Das gibt mir drei Listen, x1
, x2
, und x3
, die jeweils sagen, Größe 20.
Jetzt mache ich:
zipall = zip(x1, x2, x3)
Wenn ich jedoch:
print "len of zipall %s" % len(zipall)
Ich bekomme 20, was ich nicht erwartet habe. Ich habe drei erwartet. Ich glaube, ich mache etwas grundlegend Falsches.
python
python-2.7
AJW
quelle
quelle
zip
zu tun? Warum sollten Sie drei Listen haben - wie würden sie aussehen?Antworten:
Wenn Sie
zip()
drei Listen mit jeweils 20 Elementen zusammenfassen, enthält das Ergebnis zwanzig Elemente. Jedes Element ist ein Drei-Tupel.Überzeugen Sie sich selbst:
Um herauszufinden, wie viele Elemente jedes Tupel enthält, können Sie die Länge des ersten Elements untersuchen:
Dies funktioniert natürlich nicht, wenn die Listen zunächst leer waren.
quelle
zip
eine Liste zurückgegeben. In Python 3 ist es ein Iteratorzip
nimmt eine Reihe von Listen Likesund "zippt" sie in eine Liste, deren Einträge 3-Tupel sind
(ai, bi, ci)
. Stellen Sie sich vor, Sie zeichnen einen Reißverschluss horizontal von links nach rechts.quelle
In Python 2.7 hat dies möglicherweise gut funktioniert:
Aber in Python 3.4 sollte es so sein (andernfalls wird das Ergebnis ungefähr so aussehen
<zip object at 0x00000256124E7DC8>
):quelle
zip
Erstellt eine neue Liste mit Tupeln, die Elemente aus den iterierbaren Argumenten enthalten:Ich gehe davon aus, dass Sie versuchen, ein Tupel zu erstellen, in dem jedes Element eine Liste ist.
quelle
Quelle: Mein Blog-Beitrag (bessere Formatierung)
Beispiel
Eingang
Null oder mehr Iterables [1] (z. B. Liste, Zeichenfolge, Tupel, Wörterbuch)
Ausgabe (Liste)
i
th tuple = (element_i arg1, element_i arg2…, element_i argn
)Randfälle
1) Leere Zeichenfolge: len (str) = 0 = keine Tupel
2) Einzelne Zeichenfolge: len (str) == 2 Tupel mit len (args) == 1 Element (e)
Zip in Aktion!
1. Erstellen Sie ein Wörterbuch [2] aus zwei Listen
zip
ist eine elegante, klare und prägnante Lösung2. Drucken Sie Spalten in einer Tabelle
"*" [3] heißt "Auspacken":
f(*[arg1,arg2,arg3]) == f(arg1, arg2, arg3)
Extra Credit: Entpacken
zip(*args)
wird als "Entpacken" bezeichnet, da es den umgekehrten Effekt von hatzip
unzipped
: tuple_1 = e1 jedes gezippten Tupels. tuple_2 = e2 von jedemzipped
Fußnoten
*
Code:*
nahmnumbers
(1 arg) und "entpackte" seine '2 Elemente in 2 argsquelle
Grundsätzlich funktioniert die Zip-Funktion in Listen mit Listen, Tupeln und Wörterbüchern. Wenn Sie IPython verwenden, geben Sie einfach zip ein. Und überprüfen Sie, worum es bei zip () geht.
Wenn Sie IPython nicht verwenden, installieren Sie es einfach: "pip install ipython"
Für Listen
Die Ausgabe ist
[('a', 'p'), ('b', 'q'), ('c', 'r')
Für Wörterbuch:
Die Ausgabe ist:
quelle
In Python 3 wird
zip
stattdessen ein Iterator zurückgegeben, der an eine Listenfunktion übergeben werden muss, um die komprimierten Tupel abzurufen:Dann zu
unzip
ihnen zurück konjugieren Sie einfach den gezippten Iterator:Wenn die ursprüngliche Form der Liste anstelle von Tupeln benötigt wird:
quelle
Der Vollständigkeit halber.
Wenn komprimierte Listenlängen nicht gleich sind. Die Länge der Ergebnisliste wird die kürzeste, ohne dass ein Fehler aufgetreten ist
quelle
Ich glaube nicht, dass
zip
eine Liste zurückgegeben wird.zip
gibt einen Generator zurück. Sie müssen tunlist(zip(a, b))
, um eine Liste von Tupeln zu erhalten.quelle
Es lohnt sich, hier hinzuzufügen, da es sich um eine so hochrangige Frage zu zip handelt.
zip
ist großartiges, idiomatisches Python - aber es skaliert für große Listen überhaupt nicht sehr gut.Anstatt:
Verwenden Sie
izip
. Für die moderne Verarbeitung speichert es es im L1-Cache-Speicher und ist für größere Listen weitaus leistungsfähiger. Verwenden Sie es so einfach wie das Hinzufügen einesi
:quelle