Leçons du module (4/4)
itertools essentiels
Python expose de nombreux outils d'itération : certains sont intégrés (toujours
disponibles), d'autres vivent dans le module itertools de la bibliothèque
standard. Voici les plus importants.
enumerate : index + valeur
Lorsque vous avez besoin à la fois de l'index et de l'élément pendant une boucle :
for i, parola in enumerate(["a", "b", "c"]):
print(i, parola)
# 0 a
# 1 b
# 2 c
# commencer par un autre nombre :
for i, parola in enumerate(["a", "b", "c"], start=1):
print(i, parola)zip : itérer en parallèle
Combine plusieurs itérables élément par élément :
nomi = ["Ada", "Linus", "Grace"]
eta = [36, 54, 85]
for n, e in zip(nomi, eta):
print(f"{n} ha {e} anni")zip s'arrête à l'itérable le plus court. Pour un zip "long", utilisez
itertools.zip_longest.
Construire un dictionnaire à partir de deux listes parallèles :
dict(zip(nomi, eta))
# {'Ada': 36, 'Linus': 54, 'Grace': 85}itertools.chain : concaténer des itérables
from itertools import chain
list(chain([1, 2], [3, 4], [5]))
# [1, 2, 3, 4, 5]Sans créer de liste intermédiaire : utile pour les fichiers, générateurs, etc.
itertools.count et repeat : itérateurs infinis
from itertools import count, repeat
# count(start, step) — entiers croissants infinis
for i in count(10, 2):
if i > 20: break
print(i)
# 10, 12, 14, 16, 18, 20
# repeat(x, n) — répète la même valeur n fois (ou à l'infini sans n)
list(repeat("ok", 3)) # ['ok', 'ok', 'ok']itertools.combinations
Toutes les combinaisons (sans répétitions, indépendantes de l'ordre) d'une longueur donnée :
from itertools import combinations
list(combinations([1, 2, 3, 4], 2))
# [(1,2), (1,3), (1,4), (2,3), (2,4), (3,4)]Variante ordonnée : permutations. Variantes avec répétition :
combinations_with_replacement et product.
zip() pour les dictionnaires et itérables déséquilibrés
La fonction zip() s'arrête dès que l'itérable d'entrée le plus court est épuisé. Si vous souhaitez associer des éléments et conserver les valeurs excédentaires (en les remplissant avec une valeur par défaut comme None), vous pouvez utiliser zip_longest() du module itertools. De plus, vous pouvez passer le résultat d'un zip directement à dict() pour construire instantanément une table clé-valeur.
À vous de jouer
Étant donné les listes parallèles `countries = ['Italia', 'Francia', 'Spagna']` et `capitals = ['Roma', 'Parigi', 'Madrid']`, construisez `mapping` sous forme de dictionnaire {country: capital}. Évaluez `mapping`.
Afficher l'indice
dict(zip(countries, capitals))
Solution disponible après 3 tentatives
Exercice de révision
Étant donné `words = ['ciao', 'mondo', 'python']`, construisez `enumerated_items` sous forme de liste de tuples (i, word) en commençant à i=1. Évaluez `enumerated_items`.
Afficher l'indice
enumerate(words, start=1) → tuples (i, valeur).
Solution disponible après 3 tentatives
Défi supplémentaire
Étant donné deux listes `keys = ['a', 'b', 'c']` et `values = [10, 20, 30]`, utilisez `zip` pour les associer et convertissez le résultat en dictionnaire. Stockez le dictionnaire résultant dans `my_dict` et évaluez-le.
Afficher l'indice
Utilisez dict(zip(keys, values)) et assignez-le à my_dict.
Solution disponible après 3 tentatives