ProgrammationDéveloppeur Python Backend

Expliquez comment fonctionne la fonction zip() en Python, à quoi elle sert et quelles particularités il faut prendre en compte lors du traitement de séquences de longueur différente.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Contexte de la question
La fonction zip() est apparue en Python comme un moyen pratique de "coudre" plusieurs séquences en tuples avec des éléments correspondants, obtenant ainsi une sorte de structure "matricielle".

Problème
Une erreur se produit lorsque les développeurs utilisent zip pour des séquences de longueur différente, s'attendant à ce que le résultat soit de la longueur de la plus longue, ou utilisent incorrectement le déballage lors de la conversion inverse.

Solution
zip() prend une ou plusieurs séquences et retourne un itérateur de tuples, où le n-ième tuple contient les n-ièmes éléments de toutes les séquences. L'itération se termine lorsque la séquence la plus courte est épuisée.

Exemple de code:

names = ['John', 'Anna', 'Peter'] ages = [28, 22, 35] grouped = list(zip(names, ages)) print(grouped) # [('John', 28), ('Anna', 22), ('Peter', 35)]

Caractéristiques clés:

  • Retourne un itérateur paresseux, ne crée pas de liste en mémoire entièrement.
  • L'itération se poursuit jusqu'à la séquence la plus courte.
  • Permet de "dérouler" facilement les données en arrière avec le déballage et zip(*...)

Questions pièges.

Que se passe-t-il si zip reçoit des séquences de longueur différente ?

Le résultat sera de la longueur de la séquence la plus courte. Les autres éléments seront ignorés.

zip([1,2,3], ['a','b']) # [(1,'a'), (2,'b')]

Peut-on "dérouler" zip ? Comment retrouver les séquences d'origine ?

Oui, avec l'opérateur d'étoile de déballage et zip(*iterator):

pairs = [(1, "a"), (2, "b")] numbers, letters = zip(*pairs) print(numbers) # (1, 2)

Quelle est la différence entre zip et itertools.zip_longest ?

zip_longest de itertools fonctionne jusqu'à la plus longue séquence, remplissant les manques avec la valeur fillvalue spécifiée.

from itertools import zip_longest zip_longest([1,2], ['a','b','c'], fillvalue=None) # [(1,'a'), (2,'b'), (None, 'c')]

Erreurs typiques et anti-patterns

  • Attendre que zip crée des paires selon la longueur maximale.
  • Comportement non évident avec des séquences vides : zip est immédiatement vide.
  • Utilisation de zip sans conversion en liste en Python 3 : zip est un itérateur et peut être épuisé après itération.

Exemple de la vie

Cas négatif

Nous avons traité des paires d'utilisateurs et de mots de passe via zip, mais les listes se sont avérées de longueurs différentes. Plusieurs utilisateurs n'ont pas été pris en compte à cause du fonctionnement de zip avec la liste courte.

Avantages:

  • Code concis.

Inconvénients:

  • Perte d'informations.
  • Difficile à déboguer lorsque la raison de la perte de données n'est pas claire.

Cas positif

Pour combiner les résultats de tests et les noms d'étudiants, nous avons utilisé zip_longest avec fillvalue="n/a", préservant les données de tous les participants.

Avantages:

  • Les manques sont clairement visibles.
  • Personne n'est perdu lors du traitement.

Inconvénients:

  • Nécessite l'importation d'un module supplémentaire.