2026-01-13 14:46:09 +01:00
## Correction - Données en table
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
---
2022-03-17 22:54:29 +01:00
### 1. Manipulation de fichiers CSV
- On peut représenter un enregistrement par un dictionnaire.
- Une virgule (CSV : Comma Separated Values - Valeurs séparées par une virgule). Néanmoins, le format CSV autorise d'autres séparateurs.
2026-01-13 14:46:09 +01:00
- La table étant une liste de dictionnaires, on obtient donc le premier élément de la liste, c'est à dire un dictionnaire, donc une ligne de la table.
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
---
2022-03-17 22:54:29 +01:00
### 2. Opérations sur les tables
2026-01-13 14:46:09 +01:00
- Pour sélectionner des colonnes selon un critère donné, on va utiliser la fonction projection.
2022-03-17 22:54:29 +01:00
```python
def projection ( table , liste_attributs ):
return [{ clé : ligne [ clé ] for clé in ligne if clé in liste_attributs } for ligne in table ]
```
2026-01-13 14:46:09 +01:00
- La fonction *select* ici va sélectionner les lignes dont une des valeurs vaut 19. On obtient donc :
2022-03-17 22:54:29 +01:00
```python
2026-01-13 14:46:09 +01:00
[{ 'Prénom' : 'Chandler' , 'Math' : '19' , 'Anglais' : '15' , 'NSI' : '17' },
{ 'Prénom' : 'Ross' , 'Math' : '14' , 'Anglais' : '19' , 'NSI' : '13' }]
2022-03-17 22:54:29 +01:00
```
2026-01-13 14:46:09 +01:00
- Il y a deux (2) noms qui sont communs aux tables : on aura donc deux (2) lignes. De plus, la table U rajoute ses deux (2) colonnes (Âge, Mail) aux quatre de la table T : on aura donc 6 (six) colonnes.
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
---
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
### 3. Déterminer des fonctions basiques
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- Puisqu'il s'agit de compter le nombre de lignes, donc d'enregistrements, on peut donc utiliser la fonction *len* pour obtenir la longueur de la liste de dictionnaires.
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
```python
def cardinalite ( table ):
return len ( table )
```
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- La liste des attributs d'une table correspond aux clés du premier dictionnaire (en supposant que la table est cohérente) :
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
```python
def attributs ( table ):
if len ( table ) == 0 :
return []
return list ( table [ 0 ] . keys ())
```
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
---
2022-03-17 22:54:29 +01:00
### 4. Reconnaître une fonction
```python
def mystère ( t , cs ):
t_p = []
for l in t :
nvlle_l = {}
for c in l :
if c in cs :
nvelle_l [ c ] = l [ c ]
2026-01-13 14:46:09 +01:00
t_p . append ( nvlle_l )
return t_p
2022-03-17 22:54:29 +01:00
```
2026-01-13 14:46:09 +01:00
Cette fonction réalise une **projection** : elle crée une nouvelle table ne contenant que les colonnes (attributs) spécifiés dans la liste `cs` .
- `t` est la table d'origine (liste de dictionnaires)
- `cs` est la liste des colonnes à conserver
- Pour chaque ligne `l` de la table, on crée un nouveau dictionnaire `nvlle_l` ne contenant que les clés présentes dans `cs`
- On retourne la nouvelle table `t_p`
**Remarque** : Il y a une erreur dans le code original (`nvelle_l` au lieu de `nvlle_l` ). La version corrigée serait :
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
```python
def projection ( table , colonnes ):
table_projetee = []
for ligne in table :
nouvelle_ligne = {}
for colonne in ligne :
if colonne in colonnes :
nouvelle_ligne [ colonne ] = ligne [ colonne ]
table_projetee . append ( nouvelle_ligne )
return table_projetee
```
---
2022-03-17 22:54:29 +01:00
### 5. Tester la cohérence d'une table
2026-01-13 14:46:09 +01:00
- Fonction `coherence` qui teste si chaque ligne a le même ensemble d'attributs :
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
```python
def coherence ( table ):
"""
Teste si chaque ligne de la table a le même ensemble d'attributs
:param table: (list) une liste de dictionnaires
:return: (bool) True si la table est cohérente, False sinon
"""
if len ( table ) == 0 :
return True
attributs_reference = set ( table [ 0 ] . keys ())
for ligne in table :
if set ( ligne . keys ()) != attributs_reference :
return False
return True
```
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- Fonction `doublons` qui vérifie si un attribut apparaît deux fois avec la même valeur :
2022-03-17 22:54:29 +01:00
```python
2026-01-13 14:46:09 +01:00
def doublons ( table , attribut ):
"""
Vérifie si un attribut apparaît deux fois avec la même valeur
:param table: (list) une liste de dictionnaires
:param attribut: (str) le nom de l'attribut à vérifier
:return: (bool) True s'il y a des doublons, False sinon
"""
valeurs_vues = []
for ligne in table :
valeur = ligne [ attribut ]
if valeur in valeurs_vues :
return True
valeurs_vues . append ( valeur )
return False
2022-03-17 22:54:29 +01:00
```
2026-01-13 14:46:09 +01:00
---
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
### 6. Lier tableur, fichier CSV et liste de dictionnaires
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
```python
PlanningTwitch = [
{ 'NomStream' : 'AntoineDaniel' , 'Genre' : 'M' , 'Jeu' : 'Fall_Guys' , 'Numéro' : '1' },
{ 'NomStream' : 'MV' , 'Genre' : 'M' , 'Jeu' : 'Isaac' , 'Numéro' : '2' },
{ 'NomStream' : 'AngleDroit' , 'Genre' : 'F' , 'Jeu' : 'Fall_Guys' , 'Numéro' : '3' },
{ 'NomStream' : 'BagheraJones' , 'Genre' : 'F' , 'Jeu' : 'Fall_Guys' , 'Numéro' : '4' }
]
```
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- La première ligne de la feuille de calcul contient les en-têtes (attributs) :
`NomStream | Genre | Jeu | Numéro`
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- Pour obtenir le fichier CSV correspondant :
```python
vers_csv ( 'PlanningTwitch' , [ 'NomStream' , 'Genre' , 'Jeu' , 'Numéro' ])
```
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- La deuxième ligne du fichier CSV :
`AntoineDaniel;M;Fall_Guys;1`
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- La cellule C8 de la feuille correspondante : la table n'a que 5 lignes (1 en-tête + 4 données), donc C8 est **vide** .
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- Pour obtenir la valeur d'une cellule (par exemple C2, le jeu d'AntoineDaniel) :
2022-03-17 22:54:29 +01:00
```python
2026-01-13 14:46:09 +01:00
PlanningTwitch [ 0 ][ 'Jeu' ] # 'Fall_Guys'
```
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- Pour modifier le jeu de MV :
```python
PlanningTwitch [ 1 ][ 'Jeu' ] = 'Worms'
2022-03-17 22:54:29 +01:00
```
2026-01-13 14:46:09 +01:00
---
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
### 7. Ajouter une ligne ou une colonne
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- Pour obtenir la liste de dictionnaires depuis le fichier CSV :
2022-03-17 22:54:29 +01:00
```python
2026-01-13 14:46:09 +01:00
Groupe1 = import_csv ( 'Groupe1' )
2022-03-17 22:54:29 +01:00
```
2026-01-13 14:46:09 +01:00
- Pour ajouter Rachel :
```python
Groupe1 . append ({ 'Prénom' : 'Rachel' , 'Math' : '17' , 'Anglais' : '19' , 'NSI' : '18' })
```
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- Fonction pour ajouter une colonne moyenne :
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
```python
from copy import deepcopy
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
def ajouter_moyenne ( table ):
"""
Ajoute une colonne 'Moyenne' à chaque ligne de la table
:param table: (list) une liste de dictionnaires avec des notes
:return: (list) une nouvelle table avec la colonne Moyenne
"""
nouvelle_table = deepcopy ( table )
for ligne in nouvelle_table :
math = int ( ligne [ 'Math' ])
anglais = int ( ligne [ 'Anglais' ])
nsi = int ( ligne [ 'NSI' ])
moyenne = ( math + anglais + nsi ) / 3
ligne [ 'Moyenne' ] = ' {:.1f} ' . format ( moyenne )
return nouvelle_table
```
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- Pour ajouter une ligne contenant les moyennes par matière :
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
```python
from copy import deepcopy
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
def ajouter_ligne_moyennes ( table ):
"""
Ajoute une ligne contenant les moyennes par matière
:param table: (list) une liste de dictionnaires avec des notes
:return: (list) une nouvelle table avec la ligne des moyennes
"""
nouvelle_table = deepcopy ( table )
nb_eleves = len ( nouvelle_table )
total_math = 0
total_anglais = 0
total_nsi = 0
for ligne in nouvelle_table :
total_math = total_math + int ( ligne [ 'Math' ])
total_anglais = total_anglais + int ( ligne [ 'Anglais' ])
total_nsi = total_nsi + int ( ligne [ 'NSI' ])
ligne_moyennes = {
'Prénom' : 'Moyenne' ,
'Math' : ' {:.1f} ' . format ( total_math / nb_eleves ),
'Anglais' : ' {:.1f} ' . format ( total_anglais / nb_eleves ),
'NSI' : ' {:.1f} ' . format ( total_nsi / nb_eleves )
}
nouvelle_table . append ( ligne_moyennes )
return nouvelle_table
```
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
---
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
### 8. Sélectionner, trier, joindre
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
On définit les tables :
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
```python
Hero = [
{ 'NumHero' : '0' , 'NomHero' : 'Sangoku' , 'VilleHero' : 'Kyoto' },
{ 'NumHero' : '1' , 'NomHero' : 'Naruto' , 'VilleHero' : 'Konoha' },
{ 'NumHero' : '2' , 'NomHero' : 'Luffy' , 'VilleHero' : 'Fuchsia' },
{ 'NumHero' : '3' , 'NomHero' : 'Ryo Saeba' , 'VilleHero' : 'Tokyo' },
{ 'NumHero' : '4' , 'NomHero' : 'Saitama' , 'VilleHero' : 'Ville Z' },
{ 'NumHero' : '5' , 'NomHero' : 'Onizuka' , 'VilleHero' : 'Tokyo' }
]
Armes = [
{ 'NumHero' : '0' , 'NomHero' : 'Sangoku' , 'Arme' : 'Ki' },
{ 'NumHero' : '1' , 'NomHero' : 'Naruto' , 'Arme' : 'Chakra' },
{ 'NumHero' : '2' , 'NomHero' : 'Luffy' , 'Arme' : 'Corps' },
{ 'NumHero' : '3' , 'NomHero' : 'Ryo Saeba' , 'Arme' : 'Magnum' },
{ 'NumHero' : '4' , 'NomHero' : 'Saitama' , 'Arme' : 'Poing' },
{ 'NumHero' : '5' , 'NomHero' : 'Onizuka' , 'Arme' : 'Tout est une arme' }
]
```
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- **HeroTokyo** : héros dont la ville est Tokyo
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
```python
HeroTokyo = select ( Hero , "ligne['VilleHero'] == 'Tokyo'" )
# Résultat :
# [{'NumHero': '3', 'NomHero': 'Ryo Saeba', 'VilleHero': 'Tokyo'},
# {'NumHero': '5', 'NomHero': 'Onizuka', 'VilleHero': 'Tokyo'}]
```
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- **HeroAlpha** : héros triés par ordre alphabétique du nom
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
```python
HeroAlpha = tri ( Hero , 'NomHero' )
# Résultat :
# [{'NumHero': '2', 'NomHero': 'Luffy', 'VilleHero': 'Fuchsia'},
# {'NumHero': '1', 'NomHero': 'Naruto', 'VilleHero': 'Konoha'},
# {'NumHero': '5', 'NomHero': 'Onizuka', 'VilleHero': 'Tokyo'},
# {'NumHero': '3', 'NomHero': 'Ryo Saeba', 'VilleHero': 'Tokyo'},
# {'NumHero': '4', 'NomHero': 'Saitama', 'VilleHero': 'Ville Z'},
# {'NumHero': '0', 'NomHero': 'Sangoku', 'VilleHero': 'Kyoto'}]
```
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- **HeroComplet** : nom, ville et arme des héros (fusion puis projection)
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
```python
HeroFusion = fusion ( Hero , Armes , 'NumHero' )
HeroComplet = projection ( HeroFusion , [ 'NomHero' , 'VilleHero' , 'Arme' ])
# Résultat :
# [{'NomHero': 'Sangoku', 'VilleHero': 'Kyoto', 'Arme': 'Ki'},
# {'NomHero': 'Naruto', 'VilleHero': 'Konoha', 'Arme': 'Chakra'},
# {'NomHero': 'Luffy', 'VilleHero': 'Fuchsia', 'Arme': 'Corps'},
# {'NomHero': 'Ryo Saeba', 'VilleHero': 'Tokyo', 'Arme': 'Magnum'},
# {'NomHero': 'Saitama', 'VilleHero': 'Ville Z', 'Arme': 'Poing'},
# {'NomHero': 'Onizuka', 'VilleHero': 'Tokyo', 'Arme': 'Tout est une arme'}]
```
2022-03-17 22:54:29 +01:00
2026-01-13 14:46:09 +01:00
- **HeroVille** : numéro et ville des héros
2022-07-21 15:38:24 +02:00
2026-01-13 14:46:09 +01:00
```python
HeroVille = projection ( Hero , [ 'NumHero' , 'VilleHero' ])
# Résultat :
# [{'NumHero': '0', 'VilleHero': 'Kyoto'},
# {'NumHero': '1', 'VilleHero': 'Konoha'},
# {'NumHero': '2', 'VilleHero': 'Fuchsia'},
# {'NumHero': '3', 'VilleHero': 'Tokyo'},
# {'NumHero': '4', 'VilleHero': 'Ville Z'},
# {'NumHero': '5', 'VilleHero': 'Tokyo'}]
```
2022-07-21 15:38:24 +02:00
2026-01-13 14:46:09 +01:00
- **HeroImpair** : nom et ville des héros ne venant pas de Tokyo et dont le numéro est impair
2022-07-21 15:38:24 +02:00
2026-01-13 14:46:09 +01:00
```python
HeroImpair = select ( Hero , "ligne['VilleHero'] != 'Tokyo' and int(ligne['NumHero']) % 2 == 1" )
HeroImpair = projection ( HeroImpair , [ 'NomHero' , 'VilleHero' ])
# Résultat :
# [{'NomHero': 'Naruto', 'VilleHero': 'Konoha'}]
```
2022-07-21 15:38:24 +02:00
2026-01-13 14:46:09 +01:00
---
2022-07-21 15:38:24 +02:00
2026-08-11 23:29:03 +02:00
Source : Florian Mathieu - Licence CC BY-SA