Недавно я увидел несколько Clojure или Scala (извините, что я не знаком с ними), и они сделали zip в списке или что-то в этом роде. Что такое zip и откуда оно взялось?
Что такое zip (функциональное программирование?)
Ответ 1
Zip - это когда вы берете две входные последовательности и создаете выходную последовательность, в которой каждый два элемента из входных последовательностей в одном и том же положении объединяются с использованием некоторой функции. Пример в Haskell:
Input:
zipWith (+) [1, 2, 3] [4, 5, 6]
Вывод:
[5, 7, 9]
Вышеприведенное является более общим определением; иногда zip
относится к объединению элементов как кортежей. Например. в Haskell снова:
Input:
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
Ответ 2
zip - это общий метод функционального программирования, такой как map или fold. Эти функции вы найдете в ранних методах до ruby и python. Они предназначены для выполнения общих пакетных операций в списках.
В этом конкретном случае zip берет два списка и создает новый список кортежей из этих списков.
например, скажем, у вас есть список с (1,2,3), а другой с ( "один", "два", "три" ) Если вы их застегнете вместе, вы получите List ((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, не зная функционального программирования, я думал, что он связан с форматом сжатия. После того, как я узнал больше о функциональном программировании, я использовал его все больше и больше.
Ответ 3
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))
Ответ 4
Вы можете использовать следующий код в Python:
>>> a = [1,2]
>>> b = [3,4]
>>> zip(a,b)
[(1,3),(2,4)]
Ответ 5
Ответ Павла в значительной степени описывает его. Я просто предоставил пример F #:
let x = [1;2]
let y = ["hello"; "world"]
let z = Seq.zip x y
Значение z
будет представлять собой последовательность, содержащую кортежи элементов в одной позиции из двух последовательностей:
[(1, "hello"); (2, "world")]