Suppression des accents pour éviter les problèmes d'encodage Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
139 lines
4.3 KiB
Markdown
139 lines
4.3 KiB
Markdown
## Operation sur les tables
|
||
|
||
|
||
|
||
> Une fois que l'on dispose de données en table, nous pouvons alors manipuler ces données et effectuer des recherches ou des tris.
|
||
|
||
### Le programme
|
||
|
||

|
||
|
||
|
||
|
||
### Interrogation de table
|
||
|
||
Il arrive fréquemment que l'on souhaite accéder à différentes informations contenues dans une table de données, selon différents critères.
|
||
|
||
On suppose que la table en question est une *liste de dictionnaires* - comme vu précédemment - et que cette table sera appelée ***table*** dans la suite de ce cours.
|
||
|
||
Chaque ligne est donc un dictionnaire et chaque clé correspondra au nom d'une colonne.
|
||
|
||
✏ *Avant de commencer* ✏
|
||
|
||
> Pour comparer et vérifier différents critères, nous utiliserons les **opérateurs booléns habituels**
|
||
>
|
||
> Nous aurons donc <, >, <=, >=, ==, !=, in, not, and, or, is...
|
||
|
||
*Quand on interroge une table, on en construit une nouvelle contenant uniquement les lignes satisfaisant une condition donnée sous la forme d'une **fonction booléenne***.
|
||
|
||
#### Selection de lignes
|
||
|
||
Pour selectionner des lignes, on peut simplifier l'instruction à :
|
||
|
||
```python
|
||
[ligne for ligne in table if (condition)]
|
||
```
|
||
|
||
Cette instruction va donc générer une liste de dictionnaires verifiant la condition.
|
||
|
||
|
||
|
||
#### Selection de colonnes
|
||
|
||
Selectionner certaines colonnes revient à selectionner certaines clés dans les dictionnaires.
|
||
|
||
L'instruction ressemblera donc à :
|
||
|
||
```python
|
||
[{clé:ligne[clé] for clé in ligne if (condition sur clé)} for ligne in table]
|
||
```
|
||
|
||
|
||
|
||
--------------
|
||
|
||
### Exemples
|
||
|
||
Suivant le tableau vu précédemment
|
||
|
||
| Prénom | DS1 | DS2 | Projet |
|
||
| ------------ | ---- | ---- | ------ |
|
||
| Michelangelo | 12 | 14 | B |
|
||
| Leonardo | 15 | 16 | A |
|
||
| Raphael | 10 | 12 | C |
|
||
| Donatello | 13 | 15 | B |
|
||
|
||
On peut écrire une fonction qui va selectionner les personnes selon un critère précis :
|
||
|
||
```python
|
||
def select(table, critere):
|
||
def test(ligne):
|
||
return eval(critere)
|
||
return [ligne for ligne in table if test(ligne)]
|
||
```
|
||
|
||
On peut donc tester cela en sélectionnant les élèves ayant obtenu plus de 15 au DS n°2 :
|
||
|
||
- la fonction *eval* permet d'évaluer l'expression contenue dans la cellule *ligne* sous forme d'une chaine de caractères dans un entier.
|
||
- il est necessaire de bien le préciser dans l'appel de la fonction *select*
|
||
|
||
```python
|
||
>> select(table, "eval(ligne['DS2']) > 15")
|
||
```
|
||
|
||
Quel est le résultat obtenu ?
|
||
|
||
----
|
||
|
||
Quand on selectionne une ou plusieurs colonnes - attributs - d'une table, on appelle cela une ***projection***.
|
||
On va donc recréer une table qui ne contiendra que les attributs selectionnés :
|
||
|
||
```python
|
||
def projection (table, liste_attributs):
|
||
return [{clé:ligne[clé] for clé in ligne if clé in liste_attributs} for ligne in table]
|
||
```
|
||
|
||
Admettons que l'on souhaite ne retenir uniquement que les groupes de projet ainsi que les prénoms des élèves.
|
||
|
||
Afin de faire la recherche, on peut écrire l'instruction suivante:
|
||
|
||
```python
|
||
projection (Notes, ['Prénom', 'Projet'])
|
||
```
|
||
|
||
-------
|
||
|
||
### Manipulation de tables
|
||
|
||
#### Tri de table
|
||
|
||
On peut trier une liste avec la fonction ***sorted*** qui possède un argument ***key*** précisant le critère de tri et un argument ***reverse***, un booléen qui permet de choisir un tri croissant (par défaut ) ou décroissant (en précisant reverse = True).
|
||
|
||
On peut donc créer une fonction *tri* qui va trier n'importer quelle table en donnant l'attribut choisir pour le tri et en précisant si l'on veut obtenir le tri dans l'ordre décroissant.
|
||
|
||
```python
|
||
def tri (table, attribut, decroit = False):
|
||
def critere (ligne):
|
||
return ligne[attribut]
|
||
return sorted(table, key = critere, reverse =decroit)
|
||
```
|
||
|
||
Exemple : Pour trier dans l'ordre décroissant la table Notes selon les notes du DS n°1, on peut écrire :
|
||
|
||
```python
|
||
>> tri (Notes, 'DS1', True)
|
||
```
|
||
|
||
Quel est le résultat affiché ?
|
||
|
||
|
||
|
||
---------
|
||
|
||
Auteur : Florian Mathieu
|
||
|
||
Licence CC BY NC
|
||
|
||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="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 <a rel="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>.
|
||
|