Kodokon kodokon.com

Structures avancées : tuples, sets et collections

Choisissez la structure adaptée à chaque besoin : tuples immuables, sets pour l'appartenance en O(1), Counter et defaultdict pour les motifs récurrents.

9 min · 3 questions

Ouvrir cette leçon dans Kodokon

Choisir la bonne structure de données règle d'un coup la lisibilité et la performance. Le tuple est une séquence immuable : idéal pour un enregistrement hétérogène de taille fixe (coordonnées, paire clé-valeur). Immuable implique hashable (si son contenu l'est) : un tuple peut donc servir de clé de dictionnaire ou d'élément de set, ce qu'une liste ne peut pas. Le déballage (unpacking) rend le code expressif - et une fonction qui « retourne plusieurs valeurs » retourne en réalité un tuple.

PYTHON
point = (48.85, 2.35)
lat, lon = point

def min_max(values):
    return min(values), max(values)

low, high = min_max([3, 1, 4, 1, 5])
print(low, high)

distances = {("paris", "lyon"): 465}
print(distances[("paris", "lyon")])
Unpacking, retour multiple et tuple comme clé de dict

Le set garantit l'unicité et offre un test d'appartenance en O(1) en moyenne, là où une liste est en O(n). Sur une boucle qui vérifie x in collection des milliers de fois, la différence se mesure immédiatement. Les opérateurs ensemblistes (& intersection, - différence, | union) remplacent avantageusement des doubles boucles : comparer deux listes d'identifiants - qui a disparu, qui est nouveau - tient en deux lignes.

PYTHON
active = {"ada", "linus", "guido"}
banned = {"linus", "mallory"}

print(active & banned)
print(active - banned)
print(active | banned)

emails = ["a@x.io", "b@x.io", "a@x.io"]
unique = set(emails)
print(len(unique))
Opérations ensemblistes et déduplication

Le module collections couvre deux besoins quotidiens. Counter compte les occurrences d'un itérable et expose most_common(n) - fini les dictionnaires de comptage écrits à la main. defaultdict(factory) fabrique la valeur manquante à la volée : defaultdict(list) est l'outil canonique pour grouper des éléments par clé sans tester l'existence de la clé à chaque tour de boucle.

PYTHON
from collections import Counter, defaultdict

words = ["go", "py", "go", "rs", "go"]
counts = Counter(words)
print(counts.most_common(2))

groups = defaultdict(list)
pairs = [("fr", "Ada"), ("us", "Lin"), ("fr", "Zoe")]
for country, name in pairs:
    groups[country].append(name)
print(dict(groups))
Counter pour compter, defaultdict pour grouper

Quiz de validation

Vérifiez que vous avez bien retenu les points clés de cette leçon.

  1. Pourquoi un tuple peut-il servir de clé de dictionnaire, contrairement à une liste ?
    • Il est plus rapide à créer
    • Il est immuable, donc hashable
    • Il ne peut contenir que des nombres
    • Les dictionnaires convertissent les listes en tuples
  2. Vous testez x in collection des milliers de fois sur 100 000 éléments. Quelle structure choisir ?
    • Une liste, parcourue séquentiellement
    • Un set, appartenance en O(1) en moyenne
    • Un tuple, plus compact qu'une liste
  3. Avec groups = defaultdict(list), que fait la lecture d'une clé absente ?
    • Elle lève KeyError
    • Elle renvoie une liste vide et insère la clé
    • Elle renvoie None sans modifier le dictionnaire