2009-07-12 40 views

Respuesta

70

Zip es cuando toma dos secuencias de entrada y produce una secuencia de salida en la que cada dos elementos de secuencias de entrada en la misma posición se combinan utilizando alguna función. Un ejemplo en Haskell:

de entrada:

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

de salida:

[5, 7, 9] 

Lo anterior es una definición más genérica; a veces, zip se refiere específicamente a la combinación de elementos como tuplas. P.ej. en Haskell nuevo:

de entrada:

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

Salida:

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

Y la versión más genérica se denomina "zip con". Puede considerar "zip" como un caso especial de "zipWith":

zip xs ys = zipWith (\x y -> (xs, ys)) xs ys 
+0

no equivalente en Scala. En scala tendrías que hacer un zip, luego un mapa – drudru

+1

¡Gracias, claro! –

+1

Bueno, en realidad no es "no equivalente", es solo que Scala no tiene 'zipWith'. Obviamente, puede hacer cualquiera de los dos: defina 'zip' en términos de' zipWith', o defina 'zipWith' en términos de' zip' y 'map'. –

19

zip es un método de programación funcional común como map o fold. Encontrarás estas funciones en los ceceos iniciales hasta ruby ​​y python. Están diseñados para realizar operaciones batch comunes en las listas.

En este caso particular, zip toma dos listas y crea una nueva lista de tuplas de esas listas. Por ejemplo, supongamos que tiene una lista con (1,2,3) y otra con ("uno", "dos", "tres") 1, "uno"), (2, "dos"), (3, "tres"))

o desde la línea de comandos Scala, se obtendría:

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

Cuando vi por primera vez en Python, sin saber programación funcional, pensé que estaba relacionado con el formato de compresión. Después de que aprendí más sobre programación funcional, la he usado más y más.

+1

Por lo general, ¿cuándo se usa el método zip, o en otras palabras, cuál es el caso de uso típico de zip en real proyectos? –

6

La respuesta de Pavel prácticamente lo describe.Voy a proporcionar un F # ejemplo:

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

El valor de z habrá una secuencia que contiene tuplas de elementos en la misma posición de las dos secuencias:

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

podría utilizar el siguiente código en Python:


>>> a = [1,2] 
>>> b = [3,4] 
>>> zip(a,b) 
[(1,3),(2,4)] 
9

Desafortunadamente no tengo puntos suficientes para incluso dejar un comentario sobre la respuesta de arriba, pero

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

es mal, debería ser:

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

o simplemente:

zip = zipWith (\x y -> (x,y)) 
+2

'zip = zipWith (,)' –

Cuestiones relacionadas