Adloun

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

Faire l'exercice suivant avec le tuteur

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.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant avec le tuteur →