Ich habe kürzlich Clojure oder Scala gesehen (tut mir leid, dass ich sie nicht kenne) und sie haben auf einer Liste oder so ähnlich gezippt. Was ist zip und woher kommt es?Was ist zip (Funktionsprogrammierung?)
Antwort
Zip ist, wenn Sie zwei Eingabefolgen nehmen und eine Ausgabesequenz erzeugen, in der alle zwei Elemente aus Eingabefolgen an derselben Position mit einer Funktion kombiniert werden. Ein Beispiel in Haskell:
Input:
zipWith (+) [1, 2, 3] [4, 5, 6]
Output:
[5, 7, 9]
Das Obige ist eine allgemeinere Definition; manchmal bezieht sich zip
speziell auf das Kombinieren von Elementen als Tupel. Z.B. in Haskell wieder:
Eingang:
zip [1, 2, 3] [4, 5, 6]
Ausgang:
[(1, 4), (2, 5), (3, 6)]
Und je mehr generische Version ist "zip mit" genannt.
zip xs ys = zipWith (\x y -> (xs, ys)) xs ys
zip ist eine gemeinsame funktionale Programmierung Methode, wie Karte oder Fold: Sie können „zip“ als Sonderfall von „zipWith“ betrachten. Sie werden diese Funktionen in frühen Lispeln bis hin zu Ruby und Python finden. Sie wurden entwickelt, um allgemeine Stapeloperationen in Listen durchzuführen.
In diesem speziellen Fall nimmt zip zwei Listen und erstellt eine neue Liste von Tupeln aus diesen Listen.
Zum Beispiel, haben Sie eine Liste mit (1,2,3) und eine andere mit ("eins", "zwei", "drei") Wenn Sie sie zusammen zippen, erhalten Sie Liste ((1, "eines"), (2, "zwei"), (3, "drei"))
oder von der scala Befehlszeile, 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 sah in Python, ohne funktionale Programmierung zu wissen, dachte ich, dass es mit dem Kompressionsformat zusammenhing. Nachdem ich mehr über funktionale Programmierung gelernt habe, habe ich es mehr und mehr benutzt.
Normalerweise wann verwenden Sie zip-Methode, oder was ist der typische Anwendungsfall für zip in real Projekte? –
Pavels Antwort beschreibt es ziemlich genau.Ich werde nur ein F # Beispiel liefern:
let x = [1;2]
let y = ["hello"; "world"]
let z = Seq.zip x y
Der Wert von z
wird eine Sequenz sein, die Tupel von Elementen in der gleichen Position aus den beiden Sequenzen:
[(1, "hello"); (2, "world")]
Sie können den folgenden Code verwenden in Python:
>>> a = [1,2]
>>> b = [3,4]
>>> zip(a,b)
[(1,3),(2,4)]
Unfortunatley ich habe nicht genug Punkte haben sogar einen Kommentar über die Top-Antwort hinterlassen, aber
zip xs ys = zipWith xs ys (\x y -> (xs, ys))
ist falsch, sollte es sein:
zip xs ys = zipWith (\x y -> (x,y)) xs ys
oder einfach:
zip = zipWith (\x y -> (x,y))
'zip = zipWith (,)' –
nicht gleichwertig in scala. In scala müsstest du einen Zip machen, dann eine Karte – drudru
Danke, jetzt habe ich es kristallklar bekommen! –
Nun, es ist nicht wirklich "nicht gleichwertig", es ist nur, dass Scala nicht 'zipWith' hat. Natürlich können Sie beides tun - definieren Sie 'zip' in Bezug auf' zipWith' oder definieren Sie 'zipWith' in Bezug auf' zip' und 'map'. –