我最近看到了一些Clojure或Scala(抱歉我不熟悉它们),他们确实在列表或类似的东西上拉链。什么是拉链,它来自哪里?
答案 0 :(得分:70)
Zip是指您输入两个输入序列,并产生一个输出序列,其中来自同一位置的输入序列的每两个元素使用某个函数组合。 Haskell中的一个例子:
输入:
zipWith (+) [1, 2, 3] [4, 5, 6]
输出:
[5, 7, 9]
以上是更通用的定义;有时,zip
特指将元素组合为元组。例如。在哈斯克尔再次:
输入:
zip [1, 2, 3] [4, 5, 6]
输出:
[(1, 4), (2, 5), (3, 6)]
更通用的版本称为“zip with”。您可以将“zip”视为“zipWith”的特殊情况:
zip xs ys = zipWith (\x y -> (xs, ys)) xs ys
答案 1 :(得分:20)
zip是一种常见的函数式编程方法,如map或fold。您将在早期的lisps中找到这些函数,一直到ruby和python。它们旨在对列表执行常见的批处理操作。
在这种特殊情况下,zip会占用两个列表,并从这些列表中创建一个新的元组列表。
例如,假设您有一个列表(1,2,3),另一个列表(“一个”,“两个”,“三个”) 如果你将它们压缩在一起,你将获得List((1,“one”),(2,“two”),(3,“three”))或者从scala命令行,您将获得:
scala> List(1,2,3).zip(List("one","two","three"))
res2: List[(Int, java.lang.String)] = List((1,one), (2,two), (3,three))
当我第一次在Python中看到它时,在不知道函数式编程的情况下,我认为它与压缩格式有关。在我学习了更多关于函数式编程的知识后,我越来越多地使用它了。
答案 2 :(得分:10)
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))
答案 3 :(得分:7)
您可以在Python中使用以下代码:
>>> a = [1,2]
>>> b = [3,4]
>>> zip(a,b)
[(1,3),(2,4)]
答案 4 :(得分:6)
let x = [1;2]
let y = ["hello"; "world"]
let z = Seq.zip x y
z
的值将是包含两个序列中相同位置的项目元组的序列:
[(1, "hello"); (2, "world")]