web-dev-qa-db-fra.com

Quel est le zip (programmation fonctionnelle?)

J'ai récemment vu du clojure ou =Scala (désolé je ne suis pas familier avec eux) et ils ont fait zip sur une liste ou quelque chose comme ça. Qu'est-ce que Zip et d'où vient-il?

45
Robert Gould

Zip est lorsque vous prenez deux séquences d'entrée et produisez une séquence de sortie dans laquelle tous les deux éléments des séquences d'entrée à la même position sont combinés à l'aide de certaines fonctions. Un exemple à Haskell:

Saisir:

zipWith (+) [1, 2, 3] [4, 5, 6]

Sortir:

[5, 7, 9]

Ce qui précède est une définition plus générique; Parfois, Zip désigne spécifiquement de combiner des éléments sous forme de tuples. Par exemple. à Haskell à nouveau:

Saisir:

Zip [1, 2, 3] [4, 5, 6]

Sortir:

[(1, 4), (2, 5), (3, 6)]

Et la version plus générique est appelée "zip avec". Vous pouvez considérer "zip" comme cas particulier de "zipwith":

Zip xs ys = zipWith (\x y -> (xs, ys)) xs ys 
74
Pavel Minaev

Zip est une méthode de programmation fonctionnelle courante comme carte ou pli. Vous trouverez ces fonctions au début des Lisps jusqu'à Ruby et Python. Ils sont conçus pour effectuer des opérations de lot courantes sur des listes.

Dans ce cas particulier, ZIP prend deux listes et crée une nouvelle liste de tuples de ces listes.

par exemple, disons que vous avez eu une liste avec (1,2,3) et une autre avec ("One", "Deux", "Three") Si vous les frappez ensemble, vous obtiendrez une liste (1, "un" ), (2, "deux"), (3, "trois"))

ou de la ligne scala ligne de commande, vous obtiendrez:

scala> List(1,2,3).Zip(List("one","two","three"))
res2: List[(Int, Java.lang.String)] = List((1,one), (2,two), (3,three))

Quand je l'ai vu pour la première fois à Python, sans connaître une programmation fonctionnelle, je pensais que c'était lié au format de compression. Après avoir appris davantage sur la programmation fonctionnelle, je l'ai utilisé de plus en plus.

20
drudru

Malheureusement, je n'ai pas assez de points pour laisser un commentaire sur la meilleure réponse, mais

Zip xs ys = zipWith xs ys (\x y -> (xs, ys))

est faux, il devrait être:

Zip xs ys = zipWith (\x y -> (x,y)) xs ys

ou simplement:

Zip = zipWith (\x y -> (x,y))
10
bseibold

Vous pouvez utiliser le code suivant à Python:


>>> a = [1,2]
>>> b = [3,4]
>>> Zip(a,b)
[(1,3),(2,4)]
7
Geo

La réponse de Pavel le décrit à peu près. Je vais simplement fournir une exemple F #:

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

La valeur de z _ sera une séquence contenant des utilles d'éléments dans la même position à partir des deux séquences:

[(1, "hello"); (2, "world")]
6
Mehrdad Afshari