Nous présenterons les différentes notions à partir de l'exemple de tableau suivant, tiré du jeu des 7 familles de l'informatique, https://interstices.info/jeu-de-7-familles-de-linformatique/ :
Nom | Prénom | année de naissance | année de décès | domaine |
---|---|---|---|---|
Lovelace | Ada | 1815 | 1852 | Algorithmes et programmation |
Kahn | Gilles | 1946 | 2006 | Algorithmes et programmation |
Hooper | Grace | 1906 | 1992 | Algorithmes et programmation |
Berry | Gérard | 1948 | Algorithmes et programmation | |
Boole | Georges | 1815 | 1864 | Mathématiques et informatique |
Lions | Jacques-Louis | 1928 | 2001 | Mathématiques et informatique |
Daubechies | Ingrid | 1954 | Mathématiques et informatique | |
Hypatie d'Alexandrie | 355 | 415 | Mathématiques et informatique | |
Shannon | Claude | 1916 | 2001 | Systèmes et réseaux |
Berners-Lee | Tim | 1955 | Systèmes et réseaux | |
Turing | Alan | 1912 | 1954 | Joker |
L'un des format les plus répandu pour représenter des tableau est le format CSV. Le tableau ci-dessus a été enregistré au format csv dans le fichier "sept_familles_informatique_1.csv".
1) Ouvrez et observez ce fichier dans un éditeur de texte (par exemple notepad++) puis dans un tableur.
Python et les fichiers csv : La bibliothèque standard de python contient le module csv qui propose des fonctions permettant de lire et enregistrer facilement des fichiers au format csv.
import csv # import de la bilibothèque) csv
fichier1=open("sept_familles_informatique_1.csv")# Ouverture du fichier csv
table1=list(csv.reader(fichier1)) #la fonction list convertit le fichier en un tableau Python
table1
Si le séparateur n'est pas la virgule, comme c'est le cas dans le fichier "sept_familles_informatique_1_pv.csv", on n'obtient pas le résultat escompté :
fichier1_pv=open("sept_familles_informatique_1_pv.csv")
table1_pv=list(csv.reader(fichier1_pv))
fichier1_pv.close
table1_pv
Comme python ne trouve pas de virgule dans les lignes, il considère que chaque ligne est réduite à une seule grande chaine de caractères.
On peut cependant indiquer le séparateur à utiliser avec l'argument delimiter.
fichier1_pv=open("sept_familles_informatique_1_pv.csv")
table1_pv=list(csv.reader(fichier1_pv,delimiter=";"))
fichier1_pv.close
table1_pv
2) Quelle instruction permet d'afficher le domaine d'Ada Lovelace ?
3) Quelle instruction permet d'afficher toute la ligne correspondant à Georges Boole ?
Cette façon d'ouvrir un fichier csv comporte plusieurs inconvénients :
La bibliothèque CSV possède une fonction DictReader permettant de convertir un fichier CSV en dictionnaire ordonné
fichier1=open("sept_familles_informatique_1.csv")# Ouverture du fichier csv
table_dict1=list(csv.DictReader(fichier1))
table_dict1
On constate que la ligne d'en tête n'est pas stockée dans le tableau mais utilisée pour créer les clés du dictionnaire.
4) Pour répondre à la question précédente (Quelle instruction permet de déterminer le domaine de travail d'Ada Lovelace?) nous devons à présent écrire :
5) Quelle instruction permet d'afficher un tableau contenant l'ensemble des clés du dictionnaire Table ?
6) Complétez la fonction affiche(table, nom) qui renvoie la ligne correspondant à un nom d'informaticien.
Retour attendu :
OrderedDict([('Nom', 'Shannon'), ('Prénom', 'Claude'), ('année1', '1916'), ('année2', '2001'), ('domaine', 'Systèmes et réseaux')]
def affiche(table, nom):
"""Votre code"""
##tests
ligne = affiche(table_dict1, "Shannon")
print(ligne)
7) Ecrire une fonction domaine_de(table , nom) qui renvoie le domaine de travail de l'informaticien désigné
8) Ecrire une fonction nombre_de_cartes(table,domaine) comptant le nombre de personnes travaillant sur le domaine demandé
Retour attendu :
nombre_de_cartes(table_dict,"Algorithmes et programmation")
4
9) Ecrire une fonction encore_en_vie(table) produisant un nouveau tableau constitué des informaticiens encore en vie.
10) Ecrire une fonction encore_en_vie2(table,domaine) produisant un nouveau tableau constitué des informaticiens encore en vie dans un domaine fixé.
Lorsque l'on manipule des données en table, il est fréquent de vouloir les trier. Dans notre exemple, on peut vouloir afficher la liste de tous les informaticiens par ordre alphabétique, ou part date de naissance.
Dans cette partie, nous allons utiliser les fonctions de tri proposées par Python :
On peut passer à sort ou à sorted un argument key=une_fonction. La liste est alors triée selon les valeurs renvoyées par une_fonction quand on l'applique à chacun des éléments de la liste.
table_triee_1=sorted(table1)
print("table : ",table1)
print("table_triee_1 : ",table_triee_1)
Python ne sait pas comparer des dictionnaires. Pour utiliser la fonction sorted sur notre dictionnaire, il faut indiquer un argument permettant à Python de comparer.
table_triee_1=sorted(table_dict) #
def Nom(x):
return x["Nom"]
table_triee_2=sorted(table_dict1,key=Nom)
print(table_triee_2)
Ordre inverse: Si on veut trier plutôt dans l''ordre inverse, c''est à dire du plus grand au plus petit, il faut ajouter une autre option : reverse=True
def annee_naissance(x):
return x["année1"]
table_triee_3=sorted(table_dict1,key=annee_naissance, reverse=True)
print(table_triee_3)
9) Un problème apparaît avec l'ordre d'apparition d'Hypatie d'Alexandrie. Corrigez l'erreur engendrant cela dans les instructions précédentes.
Lorsque l'on trie un tableau selon deux critères, d'abord selon le premier puis à valeur égale selon le second, on appelle cela l'ordre lexicographique.
Pyton a la particularité de réaliser un ordre lexicographique :
(1,3)<(1,4)
(1,3)<(1,2)
"abc"<"ad"
"123"<"13"
On peut ainsi, utiliser cette propriété pour trier les personnalités du tableau suivant le domaine dans lequel ils travaillent puis suivant leur ordre alphabétique:
def domaine_puis_nom(x):
return (x["domaine"],x["Nom"])
table_triee_4=sorted(table_dict1, key=domaine_puis_nom)
print(table_triee_4)
Une première opération naturelle est de vouloir mettre dans une même table les données de deux tables existantes. On pourrait par exemple ici, compléter notre tableau avec celui-ci :
Nom | Prénom | année de naissance | année de décès | domaine |
---|---|---|---|---|
Minsky | Marvin | 1927 | 2016 | Intelligence artificielle |
LeCun | Yann | 1969 | Intelligence artificielle | |
Engelbart | Doug | 1925 | 2013 | Interaction homme-machine |
Il est enregistré au format csv dans le fichier "sept_familles_informatique_2.csv".
Les deux tables ayant les même attributs(en nom et en nombre), il est possible de les réunir en une seule table contenant toutes les valeurs. Nous pouvons le faire en utilisant l'opérateur + sur les tableaux.
fichier2=open("sept_familles_informatique_2.csv")# Ouverture du fichier csv
table_dict2=list(csv.DictReader(fichier2))
table_complete=table_dict1+table_dict2
table_complete
Nous pouvons cependant aller plus loin et considérer les tables ayant des attributs différents, mais au moins un attribut commun.
On dispose d'un second fichier "sept_familles_informatique_2.csv" contenant les nationalités de chacunes des personnalités étudiées ci-dessus.
fichier_pays=open("sept_familles_informatique_pays.csv")# Ouverture du fichier csv
table_dict_pays=list(csv.DictReader(fichier_pays))
table_dict_pays
On souhaite à présent, construire une table donnant pour chaque personnalité informatique, ses nom, prénom, date de naissance, date de décés, domaine et pays d'origine.
La première chose à faire est de créer une fonction qui étant donnée une ligne de table_dict1
et la ligne correspondante de table_dict_pays
, crée un nouveau dictionnaire représentant la ligne du résultat.
def fusion (element1,element2):
'''Votre code'''
Créer à présent une fonction permettant de fusionner nos 2 tableaux.
def fusionne_tables(table1, table2):
'''votre code'''
table_dict_fusion=fusionne_tables(table_dict1,table_dict_pays)
table_dict_fusion