Écrire top(texte, k) : les k mots les plus fréquents, du plus au moins…
Exercice d'entraînement · niveau 3 (difficile) · NSI (première), chapitre 5 — Les dictionnaires · Applications
Énoncé
Écrire top(texte, k) : les mots les plus fréquents, du plus au moins fréquent. Que promettez-vous en cas d'ex aequo ?
Corrigé
def top(texte, k):
"""Les k mots les plus frequents, du plus au moins frequent.
Precondition : k >= 0. En cas d'ex aequo, l'ordre est celui de la
premiere apparition -- on ne promet pas mieux.
"""
assert k >= 0
compte = {}
for mot in texte.lower().split():
mot = mot.strip(".,;:!?\"'()")
if mot:
compte[mot] = compte.get(mot, 0) + 1
couples = sorted(compte.items(), key=lambda couple: -couple[1])
return couples[:k]
texte = "le chat dort. le chien dort, le chat non."
assert top(texte, 3) == [("le", 3), ("chat", 2), ("dort", 2)]
assert top(texte, 0) == []
assert len(top(texte, 100)) == 5 # k plus grand que le nombre de mots
Le comptage puis le tri, dans cet ordre : on ne peut pas classer avant d'avoir tout compté. La clé de tri -couple[1] range par effectif décroissant ; le tri de Python est stable, donc deux mots à égalité restent dans leur ordre d'insertion — d'où chat avant dort. Mais cet ordre d'insertion est une commodité de Python : la docstring ne promet donc rien de plus que « l'ordre de première apparition », et un programme sérieux trierait à effectif égal par ordre alphabétique pour être reproductible partout. couples[:k] avec trop grand ne lève rien : une tranche s'arrête d'elle-même.
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.