Files
1ereNSI/donnees_en_table/MANIPULATION.md
Florian Mathieu 66323aac75 Renommer données_en_table -> donnees_en_table
Suppression des accents pour éviter les problèmes d'encodage

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 00:03:13 +01:00

139 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 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
![bo_2](assets/bo_2.png)
### 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 dUtilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.