Adloun

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.