Comment utiliser la fonction zip() en Python (combiner des itérables)

Apprenez à utiliser la fonction zip() de Python pour combiner plusieurs itérables en parallèle. Maîtrisez les créations de dictionnaires, décompressez la logique et gérez les incompatibilités de longueur.

Essayez cette solution dans l'éditeur

Aperçu

Lors d’une itération sur des ensembles de données, vous devrez souvent traiter plusieurs listes associées en parallèle. Par exemple, associer une liste de noms d'utilisateur à une liste d'ID d'utilisateur ou faire correspondre les coordonnées des valeurs X et Y. Au lieu de boucles imbriquées ou d'accès aux éléments à l'aide de compteurs d'indexation de liste, Python fournit l'élégante fonction `zip()`.

La fonction `zip(*iterables)` prend plusieurs itérables comme arguments et les agrège, renvoyant un itérateur de tuples où le i-ème tuple contient le i-ème élément de chacun des itérables d'entrée. Cela vous permet de parcourir facilement deux ou plusieurs collections simultanément avec une seule boucle « for ».

Par défaut, `zip()` arrête la combinaison lorsque l'itérable d'entrée le plus court est épuisé. Tous les éléments restants dans les itérables plus longs sont supprimés. Si vous souhaitez associer des éléments jusqu'à ce que l'itérable le plus long soit épuisé, en remplissant les valeurs manquantes avec un espace réservé, Python fournit `zip_longest()` dans le module `itertools` de la bibliothèque standard.

Sortie de code et d'exécution

Ce script montre l'itération de liste parallèle, la création d'un dictionnaire à l'aide de zip et la gestion des incohérences à l'aide de zip_longest.

from itertools import zip_longest

names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 95]

# 1. Basic Zipping in a loop
print("--- Parallel Iteration ---")
for name, score in zip(names, scores):
    print(f"{name} scored {score}")

# 2. Creating a dictionary from two lists
user_dict = dict(zip(names, scores))
print("\nCreated Dictionary:", user_dict)

# 3. Handling unequal list lengths with zip_longest
extra_names = ["Alice", "Bob", "Charlie", "David"]
short_scores = [85, 90]

# Standard zip truncates
print("\nStandard zip output:", list(zip(extra_names, short_scores)))

# zip_longest fills missing values
zipped_long = list(zip_longest(extra_names, short_scores, fillvalue="N/A"))
print("zip_longest output:", zipped_long)
Sortie terminale
--- Parallel Iteration ---
Alice scored 85
Bob scored 90
Charlie scored 95

Created Dictionary: {'Alice': 85, 'Bob': 90, 'Charlie': 95}

Standard zip output: [('Alice', 85), ('Bob', 90)]
zip_longest output: [('Alice', 85), ('Bob', 90), ('Charlie', 'N/A'), ('David', 'N/A')]

Mise en œuvre étape par étape

  • Transmettez les multiples listes ou itérables que vous souhaitez combiner à la fonction zip().
  • Décompressez les tuples générés dans une instruction de boucle for pour des itérations parallèles propres.
  • Convertissez l'objet zip en dictionnaire en utilisant dict(zip(keys_list, values_list)) pour le mappage.
  • Importez itertools.zip_longest pour combiner des listes de longueurs inégales sans perdre les valeurs de queue.

Foire aux questions

Comment « décompresser » une séquence compressée de tuples ?

Vous pouvez décompresser une séquence dans des listes distinctes à l'aide de l'opérateur de décompression * : list(zip(*zipped_tuples)).

Zip() duplique-t-il les éléments en mémoire ?

Non, zip() renvoie un itérateur qui génère des éléments à la demande, ce qui le rend extrêmement économe en mémoire.

Sujets connexes

Ressources Python recommandées

Développez vos connaissances avec des didacticiels interactifs, des aide-mémoire et des comparaisons de codes associés.