Aller au contenu

Manipulation

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

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 à :

[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 à :

[{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 :

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
>> 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 :

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:

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.

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 :

>> tri (Notes, 'DS1', True)

Quel est le résultat affiché ?


Auteur : Florian Mathieu

Licence CC BY NC

Licence Creative Commons
Ce cours est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.