2009-07-12 8 views

Antwort

70

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 
+0

nicht gleichwertig in scala. In scala müsstest du einen Zip machen, dann eine Karte – drudru

+1

Danke, jetzt habe ich es kristallklar bekommen! –

+1

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'. –

19

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.

+1

Normalerweise wann verwenden Sie zip-Methode, oder was ist der typische Anwendungsfall für zip in real Projekte? –

6

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

Sie können den folgenden Code verwenden in Python:


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

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)) 
+2

'zip = zipWith (,)' –