- La fonction *select* ici va selectionner les lignes dont une des valeurs vaut au moins 19.
- La fonction *select* ici va sélectionner les lignes dont une des valeurs vaut 19. On obtient donc :
- 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) au quatre de la table T : on aura donc 6 (six) colonnes.
---------
### 3. Determiner des fonctions basiques
- Puisqu'il s'agit de compter le nombre de lignes, donc d'enregistrement, on peut donc utiliser la fonction *len* pour obtenir la longueur de la liste de dictionnaires.
- 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.
---
### 3. Déterminer des fonctions basiques
- 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.
```python
defcardinalite(table):
returnlen(table)
returnlen(table)
```
```
- La liste des attributs d'une table correspond aux clés du premier dictionnaire (en supposant que la table est cohérente) :
```python
defattributs(table):
iflen(table)==0:
return[]
returnlist(table[0].keys())
```
- La liste des attributs d'une table =
---
-------------
### 4. Reconnaître une fonction
### 4. Reconnaître une fonction
Quel est le principe de la fonction suivante :
```python
```python
defmystère(t,cs):
defmystère(t,cs):
t_p=[]
t_p=[]
@@ -68,132 +60,268 @@ def mystère(t, cs):
forcinl:
forcinl:
ifcincs:
ifcincs:
nvelle_l[c]=l[c]
nvelle_l[c]=l[c]
t_p.append(nvelle_l)
t_p.append(nvlle_l)
returnt_p
returnt_p
```
```
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 :
```python
defprojection(table,colonnes):
table_projetee=[]
forligneintable:
nouvelle_ligne={}
forcolonneinligne:
ifcolonneincolonnes:
nouvelle_ligne[colonne]=ligne[colonne]
table_projetee.append(nouvelle_ligne)
returntable_projetee
```
---
### 5. Tester la cohérence d'une table
### 5. Tester la cohérence d'une table
-Determiner une fonction *coherence*(table) qui teste si chaque ligne a le même ensemble d'attributs.
-Fonction `coherence` qui teste si chaque ligne a le même ensemble d'attributs :
- Determiner une fonction *doublons*(table, attribut) qui vérifie si un attribut de référerence apparaît deux fois avec la même valeur dans une table.
```python
defcoherence(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
"""
iflen(table)==0:
returnTrue
attributs_reference=set(table[0].keys())
forligneintable:
ifset(ligne.keys())!=attributs_reference:
returnFalse
returnTrue
```
- Fonction `doublons` qui vérifie si un attribut apparaît deux fois avec la même valeur :
```python
defdoublons(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=[]
forligneintable:
valeur=ligne[attribut]
ifvaleurinvaleurs_vues:
returnTrue
valeurs_vues.append(valeur)
returnFalse
```
---
### 6. Lier tableur, fichier CSV et liste de dictionnaires
### 6. Lier tableur, fichier CSV et liste de dictionnaires
On dispose d'une liste de dictionnaires suivante :
-On travaille avec le tableur LibreOffice Calc de la suite LibreOffice qui produit des fichiers au format ont (alors qu'Excel de la suite Microsoft Office produit des fichiers au format xlsx). Quelle est la première ligne de la feuille de calcul obtenue dans un tableau à partir de cette liste ?
-La première ligne de la feuille de calcul contient les en-têtes (attributs) :
- Quelle commande lancer pour obtenir le fichier CSV correspondant ?
`NomStream | Genre | Jeu | Numéro`
- Quelle est la deuxième ligne du fichier CSV correspondant ?
-Quelle valeur trouve t-on à la cellule C8 de la feuille correspondante ?
-Pour obtenir le fichier CSV correspondant :
- Par quelle commande obtient-on cette valeur ?
```python
- Une erreur de saisie a lieu : MV joue à worms en fait. Quelle commande permet de modifier le fichier correpondant du tableur ?
-Comment obtenir la liste de dictionnaires correspondante en utilisant une fonction déjà vue ?
-Fonction pour ajouter une colonne moyenne :
- Ajouter les notes de l'élève Rachel qui a eu 17 en Maths, 18 en NSI et 19 en anglais.
- On voudrait ajouter une colonne contenant les moyennes de chaque élève afin d'obtenir le tableau suivant :
| Prénom | Math | Anglais | NSI | Moyenne |
| -------- | ---- | ------- | ---- | ------- |
| Joey | 16 | 17 | 18 | 17 |
| Chandler | 19 | 15 | 17 | 17 |
| Ross | 14 | 19 | 13 | 15,3 |
| Rachel | 17 | 19 | 18 | 18 |
On doit envoyer une nouvelle table qui ne modifie pas la table d'origine. Pour effectuer une copie d'une liste d'objets complexes (ici une liste de dictionnaires), on peut utiliser la fonction *deepcopy* de la bibliothèque coup. La fonction à créer pourra donc avoir la structure suivante qu'il faudra compléter :
```python
```python
fromcopyimportdeepcopy
fromcopyimportdeepcopy
defajouter_moyenne(table):
nvelle_table=deepcopy(table)
pass
returnnvelle_table
defajouter_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)
forligneinnouvelle_table:
math=int(ligne['Math'])
anglais=int(ligne['Anglais'])
nsi=int(ligne['NSI'])
moyenne=(math+anglais+nsi)/3
ligne['Moyenne']='{:.1f}'.format(moyenne)
returnnouvelle_table
```
```
Pour obtenir l'affichage d'un nombre flottant arrondi à 2 chiffres derrière la virgule, on peut utiliser la méthode *format*
-Pour ajouter une ligne contenant les moyennes par matière :
Par exemple :
```python
```python
>>'{:.2f}'.format(314/100)#indique un flottant avec 2 chiffres après la virgule
fromcopyimportdeepcopy
'3,14'
defajouter_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
- Renvoyer HeroVille, la table contenant le numéro ainsi que la ville des héros.
---
- Renvoyer HeroImpair, la table contenant le nom et la ville des hero ne venant pas de Tokyo, et dont le numéro est impair.
----------
Auteur : Florian Mathieu
Licence CC BY NC
<arel="license"href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><imgalt="Licence Creative Commons"style="border-width:0"src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"/></a><br/>Ce cours est mis à disposition selon les termes de la <arel="license"href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
@@ -152,7 +152,7 @@ On dispose de la table suivante au format CSV, dans le repertoire courant sous l
| Ross | 14 | 19 | 13 | 15,3 |
| Ross | 14 | 19 | 13 | 15,3 |
| Rachel | 17 | 19 | 18 | 18 |
| Rachel | 17 | 19 | 18 | 18 |
On doit envoyer une nouvelle table qui ne modifie pas la table d'origine. Pour effectuer une copie d'une liste d'objets complexes (ici une liste de dictionnaires), on peut utiliser la fonction *deepcopy* de la bibliothèque coup. La fonction à créer pourra donc avoir la structure suivante qu'il faudra compléter :
On doit envoyer une nouvelle table qui ne modifie pas la table d'origine. Pour effectuer une copie d'une liste d'objets complexes (ici une liste de dictionnaires), on peut utiliser la fonction *deepcopy* de la bibliothèque copy. La fonction à créer pourra donc avoir la structure suivante qu'il faudra compléter :
```python
```python
from copy import deepcopy
from copy import deepcopy
@@ -190,13 +190,13 @@ Cela devrait donner un tableau du genre :
On obtient alors un objet caractéristique de cette bibliothèque qu'on appellera *dataframe* et qu'on peut représenter par un tableau de p-uplets nommés (on utilise alors des noms au lieu d'indices).
On obtient alors un objet caractéristique de cette bibliothèque qu'on appellera *dataframe* et qu'on peut représenter par un tableau de p-uplets nommés (on utilise alors des noms au lieu d'indices).
dic.writeheader()# première ligne, celle des attributs
dic.writeheader()# première ligne, celle des attributs
forligneintable:
forligneintable:
dic.writelow(ligne)# ajoute les lignes de la table
dic.writerow(ligne)# ajoute les lignes de la table
returnNone
returnNone
```
```
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.