Recentemente ho visto un po 'di Clojure o Scala (scusate non ho familiarità con loro) e hanno fatto zip su una lista o qualcosa di simile. Cos'è zip e da dove viene?Qual è zip (programmazione funzionale?)
risposta
Zip è quando si prendono due sequenze di input, e di produrre una sequenza di output in cui ogni due elementi da sequenze di input nella stessa posizione sono combinati utilizzando una funzione. Un esempio in Haskell:
ingresso:
zipWith (+) [1, 2, 3] [4, 5, 6]
uscita:
[5, 7, 9]
Quanto sopra è una definizione più generica; a volte, zip
si riferisce specificamente alla combinazione di elementi come tuple. Per esempio. in Haskell ancora:
ingresso:
zip [1, 2, 3] [4, 5, 6]
uscita:
[(1, 4), (2, 5), (3, 6)]
E la versione più generico si chiama "zip con". Si può considerare "zip" come un caso speciale di "zipWith":
zip xs ys = zipWith (\x y -> (xs, ys)) xs ys
zip è un metodo di programmazione funzionale comune come mappa o passare. Troverete queste funzioni nelle prime lisps fino a ruby e python. Sono progettati per eseguire operazioni batch comuni sugli elenchi.
In questo caso particolare, zip prende due liste e crea una nuova lista di tuple da tali elenchi. Per esempio, diciamo che hai una lista con (1,2,3) e un'altra con ("uno", "due", "tre") 1, "uno"), (2, "due"), (3, "tre"))
o dalla riga di comando scala, si otterrebbe:
scala> List(1,2,3).zip(List("one","two","three"))
res2: List[(Int, java.lang.String)] = List((1,one), (2,two), (3,three))
Quando ho visto la prima volta in Python, senza conoscere la programmazione funzionale, ho pensato che fosse correlato al formato di compressione. Dopo aver imparato di più sulla programmazione funzionale, l'ho usato sempre di più.
Di solito quando usi il metodo zip, o in altre parole, qual è il tipico caso d'uso per zip in real progetti? –
risposta di Pavel descrive praticamente.Mi limiterò a fornire un F # esempio:
let x = [1;2]
let y = ["hello"; "world"]
let z = Seq.zip x y
Il valore di z
sarà una sequenza contenente tuple di oggetti nella stessa posizione dei due sequenze:
[(1, "hello"); (2, "world")]
è possibile utilizzare il seguente codice in Python:
>>> a = [1,2]
>>> b = [3,4]
>>> zip(a,b)
[(1,3),(2,4)]
Unfortunatley non ho abbastanza punti per lasciare anche un commento sulla risposta superiore, ma
zip xs ys = zipWith xs ys (\x y -> (xs, ys))
è sbagliato, dovrebbe essere:
zip xs ys = zipWith (\x y -> (x,y)) xs ys
o semplicemente:
zip = zipWith (\x y -> (x,y))
'zip = zipCon (,)' –
non equivalente a Scala. In scala dovresti fare una zip, quindi una mappa – drudru
Grazie ora ho capito bene! –
Beh, in realtà non è "non equivalente", è solo che Scala non ha 'zipWith'. Ovviamente, puoi fare sia - define 'zip' in termini di' zipWith', o definisci 'zipWith' in termini di' zip' e 'map'. –