2009-07-12 26 views

回答

70

Zip是當你輸入兩個輸入序列,併產生一個輸出序列,其中來自同一位置的輸入序列中的每兩個元素都使用某個函數進行組合。在Haskell一個例子:

輸入:

zipWith (+) [1, 2, 3] [4, 5, 6] 

輸出:

[5, 7, 9] 

以上是更通用的定義;有時,zip具體指的是將元素組合爲元組。例如。在Haskell再次:

輸入:

zip [1, 2, 3] [4, 5, 6] 

輸出:

[(1, 4), (2, 5), (3, 6)] 

而且更寬泛的版本被稱爲 「拉鍊帶」。您可以將「zip」視爲「zipWith」的特例:

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

Scala中不等價的。在scala中,你將不得不做一個zip,然後一張地圖 – drudru 2009-07-12 08:39:13

+1

謝謝,現在我明白了! – 2009-07-12 08:39:54

+1

那麼,它並不是真的「不等價」,它只是說Scala沒有`zipWith`。顯然,你可以按照`zipWith`來定義`zip`,或者``zip`和`map`來定義`zipWith`。 – 2009-07-12 08:41:37

19

zip是一種常見的函數式編程方法,如地圖或摺疊。你會發現這些函數在早期的Lisp中一直到ruby和python。它們旨在對列表執行常見的批處理操作。

在這種特殊情況下,zip會帶兩個列表並從這些列表中創建一個新的元組列表。例如,假設你有一個帶有(1,2,3)和另一個帶有(「一個」,「兩個」,「三個」)的列表 如果你將它們壓縮在一起,你會得到List( 1, 「1」),(2, 「兩節」),(3, 「三化」))

或階命令行,你會得到:

scala> List(1,2,3).zip(List("one","two","three")) 
res2: List[(Int, java.lang.String)] = List((1,one), (2,two), (3,three)) 

當我第一次看到它在Python中,不知道函數式編程,我認爲它與壓縮格式有關。在我學習了更多關於函數式編程的知識後,我越來越多地使用它。

6

帕維爾的回答非常多地描述它。我只是提供了一個F#例如:

let x = [1;2] 
let y = ["hello"; "world"] 
let z = Seq.zip x y 

z值將是包含項目的元組在相同的位置從兩個序列的序列:

[(1, "hello"); (2, "world")] 
7

你可以使用下面的代碼在Python:


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

Unfortunatley我沒有足夠的積分,甚至離開頂部答案評論,但

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

錯誤,它應該是:

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

或者乾脆:

zip = zipWith (\x y -> (x,y)) 
相關問題