Passer au contenu principal
eLearner.app
Module 6 · Leçon 4 sur 424/36 dans le cours~12 min
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 :

Python
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 :

Python
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 :

Python
dict(zip(nomi, eta))
# {'Ada': 36, 'Linus': 54, 'Grace': 85}

itertools.chain : concaténer des itérables

Python
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

Python
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 :

Python
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

Exercice#python.m6.l4.e1
Tentatives : 0Chargement…

É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`.

Chargement de l'éditeur…
Afficher l'indice

dict(zip(countries, capitals))

Solution disponible après 3 tentatives

Exercice de révision

Exercice#python.m6.l4.e2
Tentatives : 0Chargement…

É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`.

Chargement de l'éditeur…
Afficher l'indice

enumerate(words, start=1) → tuples (i, valeur).

Solution disponible après 3 tentatives

Défi supplémentaire

Exercice#python.m6.l4.e3
Tentatives : 0Chargement…

É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.

Chargement de l'éditeur…
Afficher l'indice

Utilisez dict(zip(keys, values)) et assignez-le à my_dict.

Solution disponible après 3 tentatives