n° 103
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 5 — Les dictionnaires · Itérer, regrouper, comparer
Énoncé
Écrire par_initiale(noms) : à chaque initiale, la liste des noms qui commencent par elle.
Corrigé
def par_initiale(noms):
"""initiale majuscule -> liste des noms, dans l'ordre d'arrivee.
Postcondition : la somme des longueurs vaut le nombre de noms non vides,
et chaque nom figure dans la liste de son initiale.
"""
groupes = {}
for nom in noms:
if nom == "":
continue
lettre = nom[0].upper()
if lettre not in groupes:
groupes[lettre] = []
groupes[lettre].append(nom)
assert sum(len(v) for v in groupes.values()) == len([n for n in noms if n])
return groupes
assert par_initiale(["Nour", "Nadia", "Yanis"]) == {"N": ["Nour", "Nadia"],
"Y": ["Yanis"]}
assert par_initiale(["ada", "Alan"]) == {"A": ["ada", "Alan"]}
assert par_initiale([]) == {}
Le motif « si la clé n'existe pas, créer une liste vide ; puis ajouter » est le même que celui du carnet de notes, et il reviendra chaque fois qu'un dictionnaire sert à regrouper. Le upper() range "ada" et "Alan" ensemble : sans lui, deux groupes pour une même lettre. Le nom vide est écarté avant nom[0], qui lèverait IndexError.
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.