Setdefault
Bonsoir à tous,
Je reviens à la charge avec mon setdefault.
A chaque itération setdefault va ajouter une valeur de names en position de clé, mais si la valeur a déjà été créé en clé une fois, ça sera une liste vide à la place ? (car on a pas deux fois la mm clé dans un dico).
Et à chaque fois le append va ajouter le prénom qui correspond ?
Dsl de revenir avec ça mais ça me travaille lol.
Merci
names = {
"Patrick": "Smith",
"Julie": "Mercier",
"Maxime": "Moulin",
"Gérard": "Moulin",
"Rose": "Mercier",
"Clara": "Smith",
"John": "Moulin",
"Michel": "Smith",
}
resultat = {}
for key, value in names.items():
resultat.setdefault(value, []).append(key)
print(resultat)
Salut Gabriel,
pour comprendre il faut que tu décomposes ce qu'il se passe.
Regarde ce que fait indépendamment le setdefault. En gros quand tu a un dictionnaire, avec cette méthode, tu renseignes une clé et une valeur. S'il trouve la clé dans le dictionnaire, il te renvoie juste la valeur associé. En revanche s'il ne trouve pas la clé dans le dictionnaire, il va créé un nouveau couple avec la clé recherchée qu'il n'a pas trouvé et la valeur à ajouter par défaut quand il ne trouve pas la clé. 2 exemples ci dessous avec une clé qui n'existe pas et une clé qui existe.
In [15]: names = {
...: "Patrick": "Smith",
...: "Julie": "Mercier",
...: "Maxime": "Moulin",
...: "Gérard": "Moulin",
...: "Rose": "Mercier",
...: "Clara": "Smith",
...: "John": "Moulin",
...: "Michel": "Smith",
...: }
In [16]: names.setdefault("Jean", "No name")
Out[16]: 'No name'
In [17]: names
Out[17]:
{'Patrick': 'Smith',
'Julie': 'Mercier',
'Maxime': 'Moulin',
'Gérard': 'Moulin',
'Rose': 'Mercier',
'Clara': 'Smith',
'John': 'Moulin',
'Michel': 'Smith',
'Jean': 'No name'}
In [18]: names.setdefault("Clara", "No name")
Out[18]: 'Smith'
In [19]: names
Out[19]:
{'Patrick': 'Smith',
'Julie': 'Mercier',
'Maxime': 'Moulin',
'Gérard': 'Moulin',
'Rose': 'Mercier',
'Clara': 'Smith',
'John': 'Moulin',
'Michel': 'Smith',
'Jean': 'No name'}
Bon maintenant revenons à ta boucle.
L'idée c'est de créer un dictionnaire qui rassemble tous les noms unique et associe les prénoms.
quand tu fais
for key, value in names.items():
Tu vas aller parcourir le dictionnaire et obtenir la clé et la valeur donc le prénom et le nom. Par exemple à la deuxième itération, tu va avoir Julie et Mercier.
Ensuite tu ajoutes dans ton dictionnaire 'resultat' le nom , (ici Mercier) et tu lui associes une liste vide car à l'itération 2 tu n'as pas encore rencontré 'Mercier' donc ton dictionnaire 'résultat' n'a pas encore la clé 'Mercier'. Donc pour cette clé qui n'existe pas encore dans ton dictionnaire le setdefault va associer la valeur par défaut, et donc []. Et sur cette liste vide tu fais un append de la clé ici 'Julie'. Sautons à l'itération 5 maintenant. Tu vas rencontrer à nouveau 'Mercier'. Cette fois, 'Mercier' est une clé existante de ton dictionnaire 'resultat' et donc c'est déjà une liste avec 'Julie'. Comme la clé existe il ne va pas associé une liste vide. le setdefault ne va rien faire dans ce cas et il va juste ajouter le prénom à la liste.
L'idéal pour ce genre de boucle qui torture l'esprit c'est d'utiliser le debug de Vscode ou Pycharm qui te permet de voir l'évolution de tes variables à chaque itération. Je montrerai cet exercice demain en session de mentorat avec utilisation du degug.
J'espère que les réponses de Thibault et la mienne t'éclaircissent un peu plus.
A bientôt.
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte