什么是zip(函数式编程?)

Rob*_*uld 44 zip functional-programming clojure

我最近看到了一些Clojure或Scala(对不起,我不熟悉它们),他们确实在列表或类似的东西上拉链.什么是拉链,它来自哪里?

Pav*_*aev 73

Zip是在您输入两个输入序列时产生的输出序列,其中使用某个函数组合来自相同位置的输入序列的每两个元素.Haskell中的一个例子:

输入:

zipWith (+) [1, 2, 3] [4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

输出:

[5, 7, 9]
Run Code Online (Sandbox Code Playgroud)

以上是一个更通用的定义; 有时,zip具体是指将元素组合为元组.例如在Haskell再次:

输入:

zip [1, 2, 3] [4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

输出:

[(1, 4), (2, 5), (3, 6)]
Run Code Online (Sandbox Code Playgroud)

更通用的版本称为"zip with".您可以将"zip"视为"zipWith"的特例:

zip xs ys = zipWith (\x y -> (xs, ys)) xs ys 
Run Code Online (Sandbox Code Playgroud)

  • 使用zipWith的zip函数既丑又错.传递给zipWith的函数是它的第一个参数...并且以zip = zipWith(,)编写zip更好 (2认同)

dru*_*dru 20

zip是一种常见的函数式编程方法,如map或fold.您将在早期的lisps中找到这些函数,一直到ruby和python.它们旨在对列表执行常见的批处理操作.

在这种特殊情况下,zip需要两个列表,并从这些列表中创建一个新的元组列表.

例如,假设您有一个列表(1,2,3)和另一个列表("一个","两个","三个")如果您将它们压缩在一起,您将得到List((1,"one") ),(2,"两个"),(3,"三个"))

或者从scala命令行,你会得到:

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

当我第一次在Python中看到它而不知道函数式编程时,我认为它与压缩格式有关.在我学习了更多关于函数式编程的知识后,我越来越多地使用它了.

  • 通常什么时候使用zip方法,换句话说,在实际项目中zip的典型用例是什么? (2认同)

bse*_*old 10

Unfortunatley我没有足够的分数甚至对最佳答案发表评论,但是

zip xs ys = zipWith xs ys (\x y -> (xs, ys))
Run Code Online (Sandbox Code Playgroud)

错的,它应该是:

zip xs ys = zipWith (\x y -> (x,y)) xs ys
Run Code Online (Sandbox Code Playgroud)

或者干脆:

zip = zipWith (\x y -> (x,y))
Run Code Online (Sandbox Code Playgroud)

  • `zip = zipWith(,)` (3认同)

Geo*_*Geo 7

您可以在Python中使用以下代码:


>>> a = [1,2]
>>> b = [3,4]
>>> zip(a,b)
[(1,3),(2,4)]
Run Code Online (Sandbox Code Playgroud)


Meh*_*ari 6

帕维尔的答案几乎描述了它.我只是提供一个F#示例:

let x = [1;2]
let y = ["hello"; "world"]
let z = Seq.zip x y
Run Code Online (Sandbox Code Playgroud)

z将是包含两个序列中相同位置的项目元组的序列:

[(1, "hello"); (2, "world")]
Run Code Online (Sandbox Code Playgroud)