Aller au contenu

TP Pokedex⚓︎

À faire sur Capytale.

Corrigé⚓︎

Question 1

Commencez par ouvrir le fichier avec l'éditeur de texte. Quel est le délimiteur utilisé?

Réponse: Le délimiteur est le point-virgule ';' .

Question 2

Importez les données dans une table:

1
2
3
4
import csv

with open('pokedex.csv') as f:
    table_pokedex = list(csv.DictReader(f, delimiter=';'))

Question 3

Existe-t-il un pokemon dont le nom est Apireine ? Si oui, quel est son 'Nom US'?

On utilise la fonction de recherche de l'exercice 2.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def recherche(valeur, champ1: str, champ2:str, table: list) -> bool:
    '''
    Dans la table, renvoie les valeurs de champ2 de si valeur est trouvée dans champ1
    '''
    resultat = []
    for e in table:
        if e[champ1] == valeur:
            resultat.append(e[champ2])
    return resultat

recherche('Apireine', 'Nom', 'Nom US', table_pokedex)

Question 4

Modifiez la table pour ne conserver que les champs:

'Nom', 'Type', 'PV', 'Attaque', 'Défense', 'code'
Il s'agit d'une sélection de colonnes, appelée aussi projection. Comme on veut modifier la table, on peut lui réaffecter la table renvoyée par la fonction projection.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def projection(table: list, liste_champs: list) -> list:
    '''
    Renvoie une table (liste de dictinonaires) des enregistrements de table ne contenant uniquement
    les champs appartenant à liste_champs.
    '''
    table_proj = []
    for e in table:
        table_proj.append({c: v for c, v in e.items() if c in liste_champs})
    return table_proj

table_pokedex = projection(table_pokedex, ['Nom', 'Type', 'PV', 'Attaque', 'Défense', 'code'])

Question 5

Combien de pokemons ont une 'Attaque' supérieure ou égale à 50?

On reprend la fonction compte de l'exercice 3, mais en la modifiant légèrement:

  • on change le ==en >=puisqu'on cherche des valeurs supérieurs ou égales
  • on n'oublie pas de convertir les valeurs en entier (ce sont des str par défaut).
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def compte(valeur, champ: str, table: list) -> int:
    '''
    Dans la table, renvoie le nombre d'occurences de valeur dans champ
    '''
    resultat = 0
    for e in table:
        if int(e[champ]) >= valeur:
            resultat += 1
    return resultat

compte(50, 'Attaque', table_pokedex)

Question 6

À partir de la table initiale, créez une nouvelle table qui ne contient que les pokemons de type 'plante' (attention, ils peuvent avoir plusieurs types, donc on cherchera une appartenance et non une égalité).

C'est une sélection de lignes vérifiant un critère, donc on peut créer rapidement la table en compréhension.

1
[pokemon for pokemon in table_pokedex if 'plante' in pokemon['Type']]

Question 7

Créez une nouvelle table triée sur le champ 'PV' par ordre décroissant.

On reprend la fonction tri en convertissant en entier les valeurs et en ajoutant la paramètre reverse=True à la fonction sorted pour le tri décroissant.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def tri(table: list, champ: str) -> list:
    '''
    Renvoie une nouvelle liste correspondant à la table triée selon champ
    '''
    def cle_tri(e):
        return int(e[champ])

    return sorted(table, key=cle_tri, reverse=True)

tri(table_pokedex, 'PV')

Question 8

La table coordonnees_communes.csv (fichier attaché à l'activité) contient les coordonnées géographiques des communes françaises. Créez une nouvelle table en fusionnant les deux tables sur le champ 'code'.

Il s'agit ici d'une fusion de deux tables. Il faut bien entendu importer l'autre fichier csv, en faisant attention au délimiteur qui est ici la virgule...

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
with open('coordonnees_communes.csv') as f:
    table_communes = list(csv.DictReader(f, delimiter=','))

def fusion(table1: list, table2: list, champ: str) -> list:
    nouvelle_table = []
    for ligne1 in table1:
        for ligne2 in table2:
            if ligne1[champ] == ligne2[champ]:
                ligne = dict(ligne1)
                for cle in ligne2:
                    if cle != champ:
                        ligne[cle] = ligne2[cle]
                nouvelle_table.append(ligne)
    return nouvelle_table

table_fusion = fusion(table_pokedex, table_communes, 'code')

Example

Créez une carte avec folium pour localiser les pokemons... Lequel est le plus proche de nous?

On parcourt la table des pokemons en ajoutant pour chacun un marker, en récupérant la latitude et la longitude converties en float. On peut également affichée en pop-up le nom du pokemon.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import folium

lieu = [48.8704, 2.31673] 

c = folium.Map(location=lieu, zoom_start=6) 

for pokemon in table_fusion:
    lieu = [float(pokemon['latitude']), float(pokemon['longitude'])]
    folium.Marker(location=lieu, popup=pokemon["Nom"]).add_to(c) 

c