La fonction zip est une fonction très simple nous venant des langages fonctionnels tels que Objective Caml ou Haskell, et permettant de combiner plusieurs listes en une seule, de manière à rendre les itérations plus efficaces.
En effet, imaginons que nous voulions itérer sur deux listes. La solution naïve venant à l'esprit est la suivante :
1 2 3 4 5
| for i in xrange(min(len(liste1), len(liste2))):
e1, e2 = liste1[i], liste2[i]
# Actions en utilisant e1 et e2 |
Cependant, comme il a été dit dans la partie sur enumerate, les indices sont à éviter le plus possible dans ce genre de contexte. Pour réaliser cela, on a donc recours à la fameuse fonction zip qui nous permet de faire cette itération sur deux listes facilement :
1 2 3
| for e1, e2 in zip(liste1, liste2):
# Actions en utilisant e1 et e2 |
Ceci s'explique par la définition de zip que l'on peut trouver dans la documentation de Python.
1 2 3 4 5 6 7 8 9
| zip(...)
zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]
Return a list of tuples, where each tuple contains the i-th element
from each of the argument sequences. The returned list is truncated
in length to the length of the shortest argument sequence. |
zip réalise donc la fonction suivante : pour une liste [a, b, c] et une autre liste [d, e, f], zip nous donnera une liste [(a, d), (b, e), (c, f)]. En effet :
1 2 3
| >>> zip(['a', 'b', 'c'], ['d', 'e', 'f'])
[('a', 'd'), ('b', 'e'), ('c', 'f')] |
Partager