50

我最近看到了一些 Clojure 或 Scala(对不起,我不熟悉它们),它们确实压缩在列表或类似的东西上。什么是 zip,它是从哪里来的?

4

5 回答 5

80

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 with”。您可以将“zip”视为“zipWith”的特例:

zip xs ys = zipWith (\x y -> (xs, ys)) xs ys 
于 2009-07-12T08:31:13.757 回答
22

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

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

例如,假设您有一个带有 (1,2,3) 的列表,另一个带有 ("one","two","three") 如果将它们压缩在一起,您将得到 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))

当我第一次在 Python 中看到它时,在不了解函数式编程的情况下,我以为它与压缩格式有关。在我更多地了解函数式编程之后,我越来越多地使用它。

于 2009-07-12T08:34:23.140 回答
10

不幸的是,我没有足够的分数来评论最佳答案,但是

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))
于 2009-11-25T17:02:25.170 回答
7

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


>>> a = [1,2]
>>> b = [3,4]
>>> zip(a,b)
[(1,3),(2,4)]
于 2009-07-12T08:52:35.740 回答
6

帕维尔的回答几乎描述了它。我将提供一个 F# 示例:

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

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

[(1, "hello"); (2, "world")]
于 2009-07-12T08:38:14.350 回答