Aller au contenu

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.

Exemples d'utilisation
>>> 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 :

Code à copier dans votre fichier
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.

Exemples d'utilisation
>>> 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.

Exemples d'utilisation
>>> 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.