2.2 MaĂźtrise des Collections
Python propose quatre structures de données fondamentales. Comprendre leurs différences, c'est écrire du code efficace.
1. Les Listes []
Ordonnées, mutables, hétérogÚnes. La structure la plus courante.
agents = ["Smith", "Brown", "Jones"]
# AccĂšs et modification
print(agents[0]) # Smith
print(agents[-1]) # Jones (dernier)
agents[1] = "White" # Modification
# Ajout / suppression
agents.append("Black") # Ajoute Ă la fin
agents.insert(0, "Zero") # InsĂšre Ă l'index 0
agents.remove("Smith") # Supprime la premiĂšre occurrence
dernier = agents.pop() # Retire et retourne le dernier
# Utilitaires
print(len(agents)) # Longueur
print("Zero" in agents) # Test d'appartenance
agents.sort() # Tri en place (modifie la liste)
triee = sorted(agents) # Tri â nouvelle liste (original intact)
# Parcours avec index
for i, agent in enumerate(agents, 1):
print(f"{i}. {agent}")
Ă vous â que valent ces expressions ?
missions = ["Morpheus", "Trinity", "Neo"]
missions.append("Tank")
print(len(missions))
print(missions[-1])
print("Smith" in missions)
missions.sort()
print(missions[0])
print(len(missions)) # 4
print(missions[-1]) # 'Tank'
print("Smith" in missions) # False
missions.sort()
print(missions[0]) # 'Morpheus' (ordre alphabétique)
2. Les Dictionnaires {}
Paires clé : valeur, ordonnées (Python 3.7+), mutables.
composant = {
"name": "requests",
"version": "2.28.1",
"license": "Apache-2.0"
}
# AccĂšs
print(composant["name"]) # requests
print(composant.get("auteur", "N/A")) # N/A (pas d'erreur si clé absente)
# Modification / ajout
composant["version"] = "2.29.0"
composant["risk"] = "low"
# Suppression
del composant["license"]
# Parcours
for cle, valeur in composant.items():
print(f"{cle} â {valeur}")
Les clĂ©s doivent ĂȘtre immuables (str, int, tuple). Les valeurs peuvent ĂȘtre n'importe quoi.
Ă vous :
sbom = {"name": "flask", "version": "2.2.2"}
print(sbom.get("name"))
print(sbom.get("license", "unknown"))
sbom["version"] = "3.0.0"
print(sbom["version"])
print(sbom.get("name")) # 'flask'
print(sbom.get("license", "unknown"))# 'unknown' (clĂ© absente â valeur par dĂ©faut)
sbom["version"] = "3.0.0"
print(sbom["version"]) # '3.0.0'
3. Tuples vs Listes
- Liste
[]: Mutable (on peut ajouter/supprimer). - Tuple
(): Immuable (lecture seule, plus rapide, sécurisé).
coordonnees = (40.71, -74.00) # Un tuple
# coordonnees[0] = 50.0 # ERREUR !
5. Sets : La Magie des Ensembles
Un set ne contient aucun doublon. Parfait pour nettoyer une liste de versions.
versions = {"1.0", "2.1", "1.0", "3.0"}
print(versions) # {'1.0', '2.1', '3.0'} â le doublon est supprimĂ©
# Opérations mathématiques
s1 = {1, 2, 3}
s2 = {3, 4, 5}
print(s1 & s2) # {3} â intersection
print(s1 | s2) # {1, 2, 3, 4, 5} â union
print(s1 - s2) # {1, 2} â diffĂ©rence
Ă vous :
s1 = {"requests", "flask", "numpy"}
s2 = {"flask", "django", "numpy"}
print(s1 & s2)
print(s1 | s2)
print(s1 - s2)
print(s1 & s2) # {'flask', 'numpy'}
print(s1 | s2) # {'requests', 'flask', 'numpy', 'django'}
print(s1 - s2) # {'requests'}
Le petit piÚge à éviter : L'élément django n'apparaßt pas dans le résultat de s1 - s2.
MĂȘme s'il est dans s2, la soustraction ne s'occupe que de "nettoyer" s1
Note : l'ordre d'affichage d'un set n'est pas garanti.
6. Comprehensions (Lists & Dicts)
Créer une collection transformée en une seule ligne. Syntaxe : [expression for item in iterable if condition].
# List Comprehension
nombres = [1, 2, 3, 4, 5]
carres = [x**2 for x in nombres if x > 2] # [9, 16, 25]
# Dictionary Comprehension
inventaire = ["requests", "flask"]
versions = {name: "latest" for name in inventaire}
# {'requests': 'latest', 'flask': 'latest'}
Ă vous :
mots = ["neo", "morpheus", "trinity"]
maj = [m.upper() for m in mots]
print(maj)
scores = {"Neo": 95, "Smith": 40, "Trinity": 88}
recus = {k: v for k, v in scores.items() if v >= 60}
print(recus)
print(maj) # ['NEO', 'MORPHEUS', 'TRINITY']
print(recus) # {'Neo': 95, 'Trinity': 88} â Smith Ă©liminĂ© (40 < 60)