50 Stimmen

Was ist zip (funktionale Programmierung?)

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?

80voto

Pavel Minaev Punkte 97251

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

21voto

drudru Punkte 4823

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.

9voto

bseibold Punkte 539

Leider habe ich nicht genug Punkte, um auch nur einen Kommentar zur ersten Antwort zu hinterlassen, aber

zip xs ys = zipWith xs ys (\x y -> (xs, ys))

es falsch sollte es sein:

zip xs ys = zipWith (\x y -> (x,y)) xs ys

oder einfach:

zip = zipWith (\x y -> (x,y))

6voto

Geo Punkte 89102

Sie könnten den folgenden Code in Python verwenden:

>>> a = [1,2]
>>> b = [3,4]
>>> zip(a,b)
[(1,3),(2,4)]

5voto

mmx Punkte 400975

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")]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X