Ich habe vor kurzem einige Clojure oder Scala (tut mir leid, ich bin nicht vertraut mit ihnen) und sie taten zip auf einer Liste oder so etwas wie das. Was ist zip und woher kommt es?
Antworten
Zu viele Anzeigen?Zip bedeutet, dass man zwei Eingabesequenzen nimmt und eine Ausgabesequenz erzeugt, in der alle zwei Elemente der Eingabesequenzen an der gleichen Position mit Hilfe einer Funktion kombiniert werden. Ein Beispiel in Haskell:
Eingabe:
zipWith (+) [1, 2, 3] [4, 5, 6]
Ausgabe:
[5, 7, 9]
Die obige Definition ist allgemeiner gehalten; manchmal, zip
bezieht sich speziell auf die Kombination von Elementen als Tupel. Z.B. wieder in Haskell:
Eingabe:
zip [1, 2, 3] [4, 5, 6]
Ausgabe:
[(1, 4), (2, 5), (3, 6)]
Und die allgemeinere Version heißt "zip mit". Sie können "zip" als einen Spezialfall von "zipWith" betrachten:
zip xs ys = zipWith (\x y -> (xs, ys)) xs ys
Zip ist eine gängige Methode der funktionalen Programmierung wie map oder fold. Sie finden diese Funktionen in den frühen Libraries bis hin zu Ruby und Python. Sie wurden entwickelt, um häufige Stapeloperationen auf Listen durchzuführen.
In diesem speziellen Fall nimmt zip zwei Listen und erstellt eine neue Liste von Tupeln aus diesen Listen.
Nehmen wir an, Sie hätten eine Liste mit (1,2,3) und eine andere mit ("eins", "zwei", "drei"). Wenn Sie sie zusammenfügen, erhalten Sie List((1, "eins"), (2, "zwei"), (3, "drei"))
oder von der Scala-Befehlszeile aus, würden Sie erhalten:
scala> List(1,2,3).zip(List("one","two","three"))
res2: List[(Int, java.lang.String)] = List((1,one), (2,two), (3,three))
Als ich es zum ersten Mal in Python sah, dachte ich, dass es mit dem Komprimierungsformat zusammenhängt, ohne Kenntnisse über funktionale Programmierung zu haben. Nachdem ich mehr über funktionale Programmierung gelernt habe, habe ich es immer häufiger verwendet.
Die Antwort von Pavel beschreibt es ziemlich genau. Ich werde nur ein F#-Beispiel zur Verfügung stellen:
let x = [1;2]
let y = ["hello"; "world"]
let z = Seq.zip x y
Der Wert von z
ist eine Sequenz, die Tupel von Elementen an der gleichen Position der beiden Sequenzen enthält:
[(1, "hello"); (2, "world")]