Fusions et jointures⚓︎
Fusionner des pokédexs
Puisque les pokédexs sont des listes, on peut les concaténer pour obtenir un nouveau pokédex. Mais cela peut créer des doublons. Pour éviter cela, on peut partir du premier pokédex et ajouter ceux du deuxième s'ils ne sont pas déjà dans le premier.
Exercice 11
Écrire une fonction fusion_pokedex
qui prend en paramètres deux listes de dictionnaires pokedex1
et pokedex2
, et qui renvoie un nouveau pokédex qui est la fusion des deux autres. Vous pouvez utiliser pokedex1.copy()
ou list(pokedex1)
pour obtenir une copie du premier pokédex et ainsi vous assurer que vous ne le modifiez pas.
Copie d'une liste
Lorsqu'on copie une liste avec la méthode copy
ou la fonction list
, on crée une nouvelle liste. Par contre cette liste contient les mêmes éléments que la liste initiale. Si ce sont des objets immuables (nombres, textes, n-uplets), cela ne pose pas de problème. Si un éléments est modifiée dans une des deux listes, il est remplacé par un nouvel élément dans cette liste et cela n'affecte pas l'autre liste.
Par contre, si ce sont des objets mutables, comme des listes ou des dictionnaires, alors toute modification d'un élément dans une des deux listes affectera également l'autre liste.
Les deux listes sont bien différentes. Si on rajoute ou si on enlève un élément, l'autre n'est pas modifiée.
On peut observer cela dans l'exemple ci-dessous, avec des pokédexs simplifiés
Les deux listes sont disjointes mais les pokémons sont les mêmes.
>>> bulbizarre = cherche("Bulbizarre", pokedex)
>>> pikachu = cherche("Pikachu", pokedex)
>>> salameche = cherche("Salamèche", pokedex)
>>> fusion_pokedex([pikachu,bulbizarre], [salameche,pikachu])
[OrderedDict([('Nom', 'Pikachu'), ('HP', 35), ...]),
OrderedDict([('Nom', 'Bulbizarre'), ('HP', 45), ...]),
OrderedDict([('Nom', 'Salamèche'), ('HP', 39), ...])]
Les pokémons légendaires
Parmi les pokémons, certains sont légendaires. La liste de ces pokémons est stockée dans pokemons_legendaires.csv
, qu'il faut télécharger et placer avec les autres fichiers. Les pokémons légendaires peuvent être importés ainsi :
legendaires = importation("pokemons_legendaires.csv")
Exercice 12
Écrire une fonction ajout_legendaires
qui prend en parmètres deux listes de dictionnaires, pokedex
et legendaires
, et qui modifie le pokédex en rajoutant le descripteur "Légendaire"
à chaque pokémon. S'il est légendaire, alors le champs vaut True
, sinon il vaut False
.
>>> ajout_legendaires(pokedex, legendaires)
>>> cherche("Mew", pokedex)
OrderedDict([('Nom', 'Mew'), ('HP', 100), ('Attaque', 100), ('Défense', 100),
('Vitesse', 100), ('Génération', 1), ('Types', ['Psy']), ('Légendaire', False)])
>>> cherche("Mewtwo", pokedex)
OrderedDict([('Nom', 'Mewtwo'), ('HP', 106), ('Attaque', 110), ('Défense', 90),
('Vitesse', 130), ('Génération', 1), ('Types', ['Psy']), ('Légendaire', True)])
Indications
Vous pouvez parcourir tous les pokémons de pokedex
et regarder si son nom correspond à un nom parmi les pokémons de legendaires
.
Pour cela, vous pouvez utiliser la fonction cherche
définie précédemment.
Vous pouvez aussi commencer par construire un dictionnaire dont les clefs sont les noms des pokémons de legendaires
, associées par exemple à True
afin d'accélérer la recherche.
Exercice 13
Écrire une fonction legendaire
qui prend en paramètres un dictionnaire pokemon
et qui renvoie le booléen indiquant si le pokémon est légendaire ou pas.
>>> legendaire(cherche("Mew", pokedex))
False
>>> legendaire(cherche("Mewtwo", pokedex))
True
Exercice 14
À l'aide des fonctions précédentes, ou de nouvelles, déterminer de quelle génération vient le pokémon légendaire de type Feu le plus fort.