Adloun

Écrire occurrences avec la variante get , puis vérifier sur mille…

Exercice de TD · niveau 2 · NSI (première), chapitre 5 — Les dictionnaires · Construire, lire, modifier

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

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.