2009-07-12 31 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)) 
相关问题