Что такое zip (функциональное программирование?) - PullRequest
43 голосов
/ 12 июля 2009

Я недавно видел некоторые Clojure или Scala (извините, я не знаком с ними), и они сделали zip в списке или что-то в этом роде. Что такое почтовый индекс и откуда он взялся?

Ответы [ 5 ]

72 голосов
/ 12 июля 2009

Zip - это когда вы берете две входные последовательности и создаете выходную последовательность, в которой каждые два элемента из входных последовательностей в одной и той же позиции объединяются с использованием некоторой функции. Пример в Хаскеле:

Введите:

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 
20 голосов
/ 12 июля 2009

zip - это распространенный метод функционального программирования, такой как map или fold. Вы найдете эти функции в ранних выпусках вплоть до ruby ​​и python. Они предназначены для выполнения общих пакетных операций со списками.

В этом конкретном случае zip берет два списка и создает новый список кортежей из этих списков.

например, допустим, у вас был список с (1,2,3), а другой с («один», «два», «три») Если вы объедините их вместе, вы получите список ((1, «один»), (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, не зная функционального программирования, я подумал, что это связано с форматом сжатия. После того, как я узнал больше о функциональном программировании, я использовал его все больше и больше.

10 голосов
/ 25 ноября 2009

К сожалению, у меня недостаточно очков, чтобы даже оставить комментарий к верхнему ответу, но

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))
7 голосов
/ 12 июля 2009

Вы можете использовать следующий код в Python:


>>> a = [1,2]
>>> b = [3,4]
>>> zip(a,b)
[(1,3),(2,4)]
6 голосов
/ 12 июля 2009

Ответ Павла в значительной степени описывает это. Я просто приведу пример F #:

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

Значение z будет последовательностью, содержащей наборы элементов в одной позиции из двух последовательностей:

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