NSI (première) · Chapitre 5 · Exercice de TD
Écrire occurrences avec la variante get , puis vérifier sur mille…
Les dictionnaires · Construire, lire, modifier · niveau 2
Énoncé
Écrire occurrences avec la variante get, puis vérifier sur mille chaînes aléatoires que les deux versions donnent le même résultat. Sur "anticonstitutionnellement", quelle lettre est la plus fréquente ?
Corrigé
def occurrences_get(t):
"""Meme specification que occurrences : la valeur par defaut 0 de get
tient lieu de cas d'initialisation."""
compte = {}
for x in t:
compte[x] = compte.get(x, 0) + 1
assert sum(compte.values()) == len(t)
return compte
Ce que get remplace exactement. La version du cours distingue deux cas : clé présente, on incrémente ; clé absente, on initialise à . La variante les réunit : compte.get(x, 0) rend pour une clé absente, et vaut bien l'initialisation. Et get ne crée rien : c'est l'affectation de la ligne, pas la lecture, qui installe l'entrée. Écrire compte[x] à la place lèverait KeyError au premier caractère.
Deux versions, un seul test. Comparer deux implémentations d'une même spécification est la forme la plus économique de test : on n'a pas à écrire les résultats attendus, il suffit de les confronter. La méthode a une limite qu'il faut connaître — si les deux versions partagent la même erreur de conception, elles seront d'accord et fausses ensemble.
Vérification.
assert occurrences("") == {}
assert occurrences("aaa") == {"a": 3}
assert occurrences([1, 2, 1]) == {1: 2, 2: 1}
alphabet = "abcde"
for _ in range(1000):
s = "".join(random.choice(alphabet) for _ in range(random.randint(0, 40)))
assert occurrences(s) == occurrences_get(s)
mot = "anticonstitutionnellement"
assert occurrences(mot)["n"] == 5 and occurrences(mot)["t"] == 5
assert sum(occurrences(mot).values()) == len(mot) == 25
Il n'y a pas une lettre la plus fréquente : n et t apparaissent cinq fois chacune. La question de l'énoncé était un piège, et c'est exactement la situation que le cours signale à propos de plus_frequent : la fonction en renvoie une, et sa docstring ne doit pas promettre laquelle. Un alphabet volontairement réduit à cinq lettres force les collisions dans les tirages aléatoires — avec vingt-six lettres et des chaînes courtes, la plupart des effectifs vaudraient et le test serait bien plus faible.
100 % gratuit
Essaie le suivant avec le tuteur
- L'exercice suivant avec le tuteur, sans compte : il guide pas à pas, sans donner la réponse
- 16 autres exercices corrigés dans ce chapitre, et 20 à chercher avec le tuteur
- Le podcast et la vidéo du chapitre et la correction filmée du TD : 2 minutes sans compte
Sans compte : le cours, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.