Python >> Tutoriel Python >  >> Python

Python Zip — Un guide illustré utile

De nombreux codeurs ont du mal à comprendre la fonction zip. Réparons ça !

Le zip() la fonction prend un nombre arbitraire d'itérables et les agrège en un seul itérable, un objet zip. Il combine le i-th valeurs de chaque argument itérable dans un tuple. Par conséquent, si vous passez deux itérables, chaque tuple contiendra deux valeurs. Si vous passez trois itérables, chaque tuple contiendra trois valeurs. Par exemple, zip ensemble répertorie [1, 2, 3] et [4, 5, 6] à [(1,4), (2,5), (3,6)] .

Un itérable est un objet qui contient plusieurs éléments sur lesquels vous pouvez itérer. Des exemples sont des listes, des ensembles ou des tuples.

Comment compresser deux listes en Python ?

Supposons que vous ayez deux listes :

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

Maintenant, vous les compressez ensemble et obtenez la nouvelle liste :

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

Comment décompresser une liste compressée en Python ?

Commençons par cette liste compressée :

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

Vous pouvez décompresser la liste en utilisant l'astuce suivante :si vous supprimez le crochet extérieur du résultat (par exemple via l'opérateur astérisque), vous obtenez les trois tuples suivants :

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

Lorsque vous les compressez ensemble, vous obtenez la nouvelle liste :

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

Vous avez donc (presque) retrouvé vos deux listes d'origine !

C'est l'idée dans l'extrait de code suivant de compresser deux listes et de décompresser à nouveau la liste résultante en deux listes :

lst_1 = [1, 2, 3]
lst_2 = [4, 5, 6]

# Zip two lists together
zipped = list(zip(lst_1, lst_2))
print(zipped)
# [(1, 4), (2, 5), (3, 6)]


# Unzip to lists again
lst_1_new, lst_2_new = zip(*zipped)
print(list(lst_1_new))
print(list(lst_2_new))

Énigme : quelle sera la sortie des deux dernières instructions d'impression ?

Le zip() La fonction prend un certain nombre d'itérables et les agrège en un seul en combinant les ièmes valeurs de chaque itérable dans un tuple. Vous pouvez décompresser cette liste de tuples en appelant zip(*list) en utilisant l'opérateur de déballage (astérisque) * .

Le reste de cet article vise à répondre à vos questions concernant le zip() fonction.

Comment compresser des listes de longueurs différentes ?

Il ignore simplement les éléments restants de la liste plus longue. Voici un exemple:

print(list(zip([1,2,3],[1,2]))) # [(1, 1), (2, 2)] 

Comment utiliser zip avec un seul argument ?

Vous pouvez le faire. Mais la question la plus intéressante est :que va-t-il se passer ?

Python crée toujours un tuple du i-th éléments - seulement qu'il n'y en a qu'un seul. Ainsi, le tuple n'a qu'un seul élément. La sortie par défaut d'un tuple avec un élément x est (x,).

print(list(zip([1,2,3]))) # [(1,), (2,), (3,)] 

Ce formatage de sortie étrange a causé une certaine confusion parmi les lecteurs de mon cours de messagerie Python (rejoignez-nous, c'est gratuit !). J'espère que vous comprenez maintenant parfaitement qu'il ne s'agit pas d'un bogue en Python mais seulement d'un tuple avec un seul élément. (Ne me demandez pas pourquoi ils n'ont pas utilisé le format "(x)" au lieu de "(x,)".)

Qu'est-ce qu'un objet zip en Python ?

Vous vous rendrez vite compte que le résultat de la fonction zip n'est ni une liste ni un tuple :

x = [[1,2],[3,4]]
print(zip(*x))

Vous vous attendriez à [(1,3),(2,4)] mais le résultat est "". C'est bizarre, n'est-ce pas ?

Eh bien - en fait non. Le résultat de la fonction zip() est un itérateur, pas une liste.

Un itérateur en Python est un objet qui contient un nombre fixe d'éléments, et vous permet d'accéder à chaque élément de manière ordonnée (le prochain(itérateur) fonction pour un itérateur). C'est plus efficace et plus polyvalent - par rapport à la création d'une liste et au renvoi de la liste en conséquence.

Pour résoudre ce problème, vous devez convertir l'objet itérateur dans l'itérable que vous souhaitez (par exemple, set, list, tuple):

x = [[1,2],[3,4]]
print(list(zip(*x)))
# [(1, 3), (2, 4)]

Enfin, permettez-moi de clarifier une dernière chose :l'opérateur astérisque est placé juste avant l'itérable à décompresser (pas après ou ailleurs). Si vous placez l'opérateur astérisque ailleurs, Python pensera qu'il s'agit d'une multiplication et générera une erreur (dans le meilleur des cas) :

x = [[1,2],[3,4]]
y = zip*(x)
# NO!

y = zip(x*)
# NO!

y = *zip(x)
# No! (It's an iterator not an iterable)

y = zip(*x)
# Yes!

Où aller à partir d'ici ?

Cet article est basé sur l'une de mes conférences gratuites sur Python Email. Je l'appelle "Coffee Break Python Email Course" car il améliorera vos compétences en Python pendant votre pause-café. Il vous suffit de lire mes e-mails quotidiens et de participer aux défis de codage amusants. Mes> 5 000 lecteurs l'adorent.

Venez nous rejoindre !