Aller au contenu

Dictionnaire des antécédents⚓︎

Un dictionnaire associe des valeurs à des clés, comme {"Paris": "P", "Lyon": "L", "Nantes": "N", "Lille": "L"} qui associe "P" à la clé "Paris".

Suivant les cas, une même valeur peut être associée à une ou plusieurs clés. Dans l'exemple précédent, la valeur "L" est associée aux clés "Lyon" et "Lille", on les appelle les antécédents de "L", tandis que "P" a la clé "Paris" pour seul et unique antécédent.

On peut ainsi construire le dictionnaire des antécédents {"P": ["Paris"], "L": ["Lyon", "Lille"], "N": ["Nantes"]}.

Vous devez écrire une fonction antecedents, de paramètre dico, qui renvoie le dictionnaire associant les valeurs de dico à la liste de leurs antécédents dans dico.

Notes

Puisqu'aucun ordre ne vous est imposé dans la construction des listes, une étape supplémentaire de tri est réalisée lors des tests de validation.

Par ailleurs, nous garantissons que le type utilisé autorise bien les valeurs à servir de clé.

Exemples
🐍 Console Python
>>> antecedents({'a': 5, 'b': 7})
{5: ['a'], 7: ['b']}
>>> antecedents({'a': 5, 'b': 7, 'c': 5})
{5: ['a', 'c'], 7: ['b']}
>>> antecedents({"Paris": "P", "Lyon": "L", "Nantes": "N", "Lille": "L"})
{"P": ["Paris"], "L": ["Lyon", "Lille"], "N": ["Nantes"]}
###
# testsbksl-nlbksl-nlbksl-nldef trier(d):bksl-nl return {k: list(sorted(d[k])) for k in d}bksl-nlbksl-nlbksl-nlassert trier(antecedents({"a": 5, "b": 7})) == {5: ["a"], 7: ["b"]}, "exemple 1"bksl-nlassert trier(antecedents({"a": 5, "b": 7, "c": 5})) == {bksl-nl 5: ["a", "c"],bksl-nl 7: ["b"],bksl-nl}, "exemple 2"bksl-nlassert trier(antecedents({"Paris": "P", "Lyon": "L", "Nantes": "N", "Lille": "L"})) == {bksl-nl "P": ["Paris"],bksl-nl "L": ["Lille", "Lyon"],bksl-nl "N": ["Nantes"],bksl-nl}, "exemple 3"bksl-nlbksl-nl# autres testsbksl-nlbksl-nlassert trier(bksl-nl antecedents(bksl-nl {bksl-nl "Paris": "Tour Eiffel",bksl-nl "Rome": "Colisée",bksl-nl "Berlin": "Reichtag",bksl-nl "Londres": "Big Ben",bksl-nl }bksl-nl )bksl-nl) == {bksl-nl "Tour Eiffel": ["Paris"],bksl-nl "Colisée": ["Rome"],bksl-nl "Reichtag": ["Berlin"],bksl-nl "Big Ben": ["Londres"],bksl-nl}, "test 4"bksl-nlassert trier(antecedents({})) == {}, "test 5"bksl-nlassert trier(antecedents({"a": "a"})) == {"a": ["a"]}, "test 6"bksl-nlassert trier(antecedents({c: 0 for c in "abcdef"})) == {0: list("abcdef")}, "test 7"bksl-nlbksl-nl 5/5

def antecedents(dico):bksl-nl ...bksl-nlbksl-nlbksl-nl# testsbksl-nlbksl-nlbksl-nldef trier(d):bksl-nl return {k: list(sorted(d[k])) for k in d}bksl-nlbksl-nlbksl-nlassert trier(antecedents({"a": 5, "b": 7})) == {5: ["a"], 7: ["b"]}, "exemple 1"bksl-nlassert trier(antecedents({"a": 5, "b": 7, "c": 5})) == {bksl-nl 5: ["a", "c"],bksl-nl 7: ["b"],bksl-nl}, "exemple 2"bksl-nlassert trier(antecedents({"Paris": "P", "Lyon": "L", "Nantes": "N", "Lille": "L"})) == {bksl-nl "P": ["Paris"],bksl-nl "L": ["Lille", "Lyon"],bksl-nl "N": ["Nantes"],bksl-nl}, "exemple 3"bksl-nlbksl-nldef antecedents(dico):bksl-nl dicopy-undantecedents = {}bksl-nl for cle, valeur in dico.items():bksl-nl if valeur not in dicopy-undantecedents:bksl-nl dicopy-undantecedents[valeur] = [cle]bksl-nl else:bksl-nl dicopy-undantecedents[valeur].append(cle)bksl-nl return dicopy-undantecedentsbksl-nlbksl-nl

A

Solution sans items⚓︎

🐍 Script Python
def antecedents(dico):
    dico_antecedents = {}
    for cle in dico:
        valeur = dico[cle]
        if valeur not in dico_antecedents:
            dico_antecedents[valeur] = [cle]
        else:
            dico_antecedents[valeur].append(cle)
    return dico_antecedents

Variante⚓︎

Pour chaque couple (cle, valeur) il faut tester l'absence de valeur dans le dictionnaire des antécédents afin de lui associer la liste [cle] si tel est le cas, et de compléter la liste existante dico_antecedents[valeur] en invoquant la méthode append dans le cas contraire.

Voici une variante qui initialise une liste vide et procède systématiquement à l'ajout de cle.

🐍 Script Python
def antecedents(dico):
    dico_antecedents = {}
    for cle, valeur in dico.items():
        if valeur not in dico_antecedents:
            dico_antecedents[valeur] = []
        dico_antecedents[valeur].append(cle)
    return dico_antecedents

Z