TRAITEMENT DE DONNEES EN TABLES

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.

Lire un fichier au format CSV

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.

In [2]:
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
In [3]:
table1
Out[3]:
[['Nom', 'Prénom', 'année1', 'année2', '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']]

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

In [7]:
fichier1_pv=open("sept_familles_informatique_1_pv.csv")
table1_pv=list(csv.reader(fichier1_pv))                 
fichier1_pv.close
table1_pv
Out[7]:
[['Nom;Prénom;année1;année2;domaine'],
 ['Lovelace;Ada;1815;1852;Algorithme et programmation'],
 ['Kahn;Gilles;1946;2006;Algorithme et programmation'],
 ['Hooper;Grace;1906;1992;Algorithme et programmation'],
 ['Berry;Gérard;1948;;Algorithme 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']]

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.

In [8]:
fichier1_pv=open("sept_familles_informatique_1_pv.csv")
table1_pv=list(csv.reader(fichier1_pv,delimiter=";"))                
fichier1_pv.close
table1_pv
Out[8]:
[['Nom', 'Prénom', 'année1', 'année2', 'domaine'],
 ['Lovelace', 'Ada', '1815', '1852', 'Algorithme et programmation'],
 ['Kahn', 'Gilles', '1946', '2006', 'Algorithme et programmation'],
 ['Hooper', 'Grace', '1906', '1992', 'Algorithme et programmation'],
 ['Berry', 'Gérard', '1948', '', 'Algorithme 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']]

2) Quelle instruction permet d'afficher le domaine d'Ada Lovelace ?

In [ ]:
 

3) Quelle instruction permet d'afficher toute la ligne correspondant à Georges Boole ?

In [ ]:
 

Cette façon d'ouvrir un fichier csv comporte plusieurs inconvénients :

  • la première ligne listant les attributs de notre table a été chargée comme une ligne de donnée
  • nous sommes obligés de nous souvenir de la correspondance entre l'attribut et le numéro de colonne correspondant

La bibliothèque CSV possède une fonction DictReader permettant de convertir un fichier CSV en dictionnaire ordonné

In [9]:
fichier1=open("sept_familles_informatique_1.csv")# Ouverture du fichier csv
table_dict1=list(csv.DictReader(fichier1)) 
table_dict1
Out[9]:
[OrderedDict([('Nom', 'Lovelace'),
              ('Prénom', 'Ada'),
              ('année1', '1815'),
              ('année2', '1852'),
              ('domaine', 'Algorithmes et programmation')]),
 OrderedDict([('Nom', 'Kahn'),
              ('Prénom', 'Gilles'),
              ('année1', '1946'),
              ('année2', '2006'),
              ('domaine', 'Algorithmes et programmation')]),
 OrderedDict([('Nom', 'Hooper'),
              ('Prénom', 'Grace'),
              ('année1', '1906'),
              ('année2', '1992'),
              ('domaine', 'Algorithmes et programmation')]),
 OrderedDict([('Nom', 'Berry'),
              ('Prénom', 'Gérard'),
              ('année1', '1948'),
              ('année2', ''),
              ('domaine', 'Algorithmes et programmation')]),
 OrderedDict([('Nom', 'Boole'),
              ('Prénom', 'Georges'),
              ('année1', '1815'),
              ('année2', '1864'),
              ('domaine', 'Mathématiques et informatique')]),
 OrderedDict([('Nom', 'Lions'),
              ('Prénom', 'Jacques-Louis'),
              ('année1', '1928'),
              ('année2', '2001'),
              ('domaine', 'Mathématiques et informatique')]),
 OrderedDict([('Nom', 'Daubechies'),
              ('Prénom', 'Ingrid'),
              ('année1', '1954'),
              ('année2', ''),
              ('domaine', 'Mathématiques et informatique')]),
 OrderedDict([('Nom', "Hypatie d'Alexandrie"),
              ('Prénom', ''),
              ('année1', '355'),
              ('année2', '415'),
              ('domaine', 'Mathématiques et informatique')]),
 OrderedDict([('Nom', 'Shannon'),
              ('Prénom', 'Claude'),
              ('année1', '1916'),
              ('année2', '2001'),
              ('domaine', 'Systèmes et réseaux')]),
 OrderedDict([('Nom', 'Berners-Lee'),
              ('Prénom', 'Tim'),
              ('année1', '1955'),
              ('année2', ''),
              ('domaine', 'Systèmes et réseaux')]),
 OrderedDict([('Nom', 'Turing'),
              ('Prénom', 'Alan'),
              ('année1', '1912'),
              ('année2', '1954'),
              ('domaine', 'Joker')])]

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 :

In [ ]:
 

5) Quelle instruction permet d'afficher un tableau contenant l'ensemble des clés du dictionnaire Table ?

In [ ]:
 

Recherche dans une table

Récupération d'une ligne

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')]

In [12]:
def affiche(table, nom):
    """Votre code"""

##tests
ligne = affiche(table_dict1, "Shannon")
print(ligne)
None

Récupération d'une donnée simple

7) Ecrire une fonction domaine_de(table , nom) qui renvoie le domaine de travail de l'informaticien désigné

In [ ]:
 

Comptage d'occurence

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

In [ ]:
 

Sélection de lignes

9) Ecrire une fonction encore_en_vie(table) produisant un nouveau tableau constitué des informaticiens encore en vie.

In [ ]:
 

10) Ecrire une fonction encore_en_vie2(table,domaine) produisant un nouveau tableau constitué des informaticiens encore en vie dans un domaine fixé.

In [ ]:
 

Tri d'une table

Trier une table suivant une colonne

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 :

  • La fonction sorted(liste) qui renvoie une copie triée dans l'ordre croissant de liste.
  • La méthode liste.sort() qui trie dans l'ordre croisssant la liste en la modifiant. On évitera donc cette méthode pour ne pas perdre nos données.

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.

In [13]:
table_triee_1=sorted(table1)
print("table : ",table1)
print("table_triee_1 : ",table_triee_1)
table :  [['Nom', 'Prénom', 'année1', 'année2', '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']]
table_triee_1 :  [['Berners-Lee', 'Tim', '1955', '', 'Systèmes et réseaux'], ['Berry', 'Gérard', '1948', '', 'Algorithmes et programmation'], ['Boole', 'Georges', '1815', '1864', 'Mathématiques et informatique'], ['Daubechies', 'Ingrid', '1954', '', 'Mathématiques et informatique'], ['Hooper', 'Grace', '1906', '1992', 'Algorithmes et programmation'], ["Hypatie d'Alexandrie", '', '355', '415', 'Mathématiques et informatique'], ['Kahn', 'Gilles', '1946', '2006', 'Algorithmes et programmation'], ['Lions', 'Jacques-Louis', '1928', '2001', 'Mathématiques et informatique'], ['Lovelace', 'Ada', '1815', '1852', 'Algorithmes et programmation'], ['Nom', 'Prénom', 'année1', 'année2', 'domaine'], ['Shannon', 'Claude', '1916', '2001', 'Systèmes et réseaux'], ['Turing', 'Alan', '1912', '1954', 'Joker']]

Python ne sait pas comparer des dictionnaires. Pour utiliser la fonction sorted sur notre dictionnaire, il faut indiquer un argument permettant à Python de comparer.

In [40]:
table_triee_1=sorted(table_dict) #
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-40-4c1782f47faa> in <module>()
----> 1 table_triee_1=sorted(table_dict)

TypeError: '<' not supported between instances of 'collections.OrderedDict' and 'collections.OrderedDict'
In [14]:
def Nom(x):
    return x["Nom"]
table_triee_2=sorted(table_dict1,key=Nom)
print(table_triee_2)
[OrderedDict([('Nom', 'Berners-Lee'), ('Prénom', 'Tim'), ('année1', '1955'), ('année2', ''), ('domaine', 'Systèmes et réseaux')]), OrderedDict([('Nom', 'Berry'), ('Prénom', 'Gérard'), ('année1', '1948'), ('année2', ''), ('domaine', 'Algorithmes et programmation')]), OrderedDict([('Nom', 'Boole'), ('Prénom', 'Georges'), ('année1', '1815'), ('année2', '1864'), ('domaine', 'Mathématiques et informatique')]), OrderedDict([('Nom', 'Daubechies'), ('Prénom', 'Ingrid'), ('année1', '1954'), ('année2', ''), ('domaine', 'Mathématiques et informatique')]), OrderedDict([('Nom', 'Hooper'), ('Prénom', 'Grace'), ('année1', '1906'), ('année2', '1992'), ('domaine', 'Algorithmes et programmation')]), OrderedDict([('Nom', "Hypatie d'Alexandrie"), ('Prénom', ''), ('année1', '355'), ('année2', '415'), ('domaine', 'Mathématiques et informatique')]), OrderedDict([('Nom', 'Kahn'), ('Prénom', 'Gilles'), ('année1', '1946'), ('année2', '2006'), ('domaine', 'Algorithmes et programmation')]), OrderedDict([('Nom', 'Lions'), ('Prénom', 'Jacques-Louis'), ('année1', '1928'), ('année2', '2001'), ('domaine', 'Mathématiques et informatique')]), OrderedDict([('Nom', 'Lovelace'), ('Prénom', 'Ada'), ('année1', '1815'), ('année2', '1852'), ('domaine', 'Algorithmes et programmation')]), OrderedDict([('Nom', 'Shannon'), ('Prénom', 'Claude'), ('année1', '1916'), ('année2', '2001'), ('domaine', 'Systèmes et réseaux')]), OrderedDict([('Nom', 'Turing'), ('Prénom', 'Alan'), ('année1', '1912'), ('année2', '1954'), ('domaine', 'Joker')])]

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

In [15]:
def annee_naissance(x):
    return x["année1"]
table_triee_3=sorted(table_dict1,key=annee_naissance, reverse=True)
print(table_triee_3)
[OrderedDict([('Nom', "Hypatie d'Alexandrie"), ('Prénom', ''), ('année1', '355'), ('année2', '415'), ('domaine', 'Mathématiques et informatique')]), OrderedDict([('Nom', 'Berners-Lee'), ('Prénom', 'Tim'), ('année1', '1955'), ('année2', ''), ('domaine', 'Systèmes et réseaux')]), OrderedDict([('Nom', 'Daubechies'), ('Prénom', 'Ingrid'), ('année1', '1954'), ('année2', ''), ('domaine', 'Mathématiques et informatique')]), OrderedDict([('Nom', 'Berry'), ('Prénom', 'Gérard'), ('année1', '1948'), ('année2', ''), ('domaine', 'Algorithmes et programmation')]), OrderedDict([('Nom', 'Kahn'), ('Prénom', 'Gilles'), ('année1', '1946'), ('année2', '2006'), ('domaine', 'Algorithmes et programmation')]), OrderedDict([('Nom', 'Lions'), ('Prénom', 'Jacques-Louis'), ('année1', '1928'), ('année2', '2001'), ('domaine', 'Mathématiques et informatique')]), OrderedDict([('Nom', 'Shannon'), ('Prénom', 'Claude'), ('année1', '1916'), ('année2', '2001'), ('domaine', 'Systèmes et réseaux')]), OrderedDict([('Nom', 'Turing'), ('Prénom', 'Alan'), ('année1', '1912'), ('année2', '1954'), ('domaine', 'Joker')]), OrderedDict([('Nom', 'Hooper'), ('Prénom', 'Grace'), ('année1', '1906'), ('année2', '1992'), ('domaine', 'Algorithmes et programmation')]), OrderedDict([('Nom', 'Lovelace'), ('Prénom', 'Ada'), ('année1', '1815'), ('année2', '1852'), ('domaine', 'Algorithmes et programmation')]), OrderedDict([('Nom', 'Boole'), ('Prénom', 'Georges'), ('année1', '1815'), ('année2', '1864'), ('domaine', 'Mathématiques et informatique')])]

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.

In [ ]:
 

Ordre lexicographique

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 :

In [46]:
(1,3)<(1,4)
Out[46]:
True
In [47]:
(1,3)<(1,2) 
Out[47]:
False
In [48]:
"abc"<"ad"
Out[48]:
True
In [49]:
"123"<"13"
Out[49]:
True

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:

In [16]:
def domaine_puis_nom(x):
    return (x["domaine"],x["Nom"])
table_triee_4=sorted(table_dict1, key=domaine_puis_nom)
print(table_triee_4)
[OrderedDict([('Nom', 'Berry'), ('Prénom', 'Gérard'), ('année1', '1948'), ('année2', ''), ('domaine', 'Algorithmes et programmation')]), OrderedDict([('Nom', 'Hooper'), ('Prénom', 'Grace'), ('année1', '1906'), ('année2', '1992'), ('domaine', 'Algorithmes et programmation')]), OrderedDict([('Nom', 'Kahn'), ('Prénom', 'Gilles'), ('année1', '1946'), ('année2', '2006'), ('domaine', 'Algorithmes et programmation')]), OrderedDict([('Nom', 'Lovelace'), ('Prénom', 'Ada'), ('année1', '1815'), ('année2', '1852'), ('domaine', 'Algorithmes et programmation')]), OrderedDict([('Nom', 'Turing'), ('Prénom', 'Alan'), ('année1', '1912'), ('année2', '1954'), ('domaine', 'Joker')]), OrderedDict([('Nom', 'Boole'), ('Prénom', 'Georges'), ('année1', '1815'), ('année2', '1864'), ('domaine', 'Mathématiques et informatique')]), OrderedDict([('Nom', 'Daubechies'), ('Prénom', 'Ingrid'), ('année1', '1954'), ('année2', ''), ('domaine', 'Mathématiques et informatique')]), OrderedDict([('Nom', "Hypatie d'Alexandrie"), ('Prénom', ''), ('année1', '355'), ('année2', '415'), ('domaine', 'Mathématiques et informatique')]), OrderedDict([('Nom', 'Lions'), ('Prénom', 'Jacques-Louis'), ('année1', '1928'), ('année2', '2001'), ('domaine', 'Mathématiques et informatique')]), OrderedDict([('Nom', 'Berners-Lee'), ('Prénom', 'Tim'), ('année1', '1955'), ('année2', ''), ('domaine', 'Systèmes et réseaux')]), OrderedDict([('Nom', 'Shannon'), ('Prénom', 'Claude'), ('année1', '1916'), ('année2', '2001'), ('domaine', 'Systèmes et réseaux')])]

Fusion de tables

Réunion de tables

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.

In [17]:
fichier2=open("sept_familles_informatique_2.csv")# Ouverture du fichier csv
table_dict2=list(csv.DictReader(fichier2))

table_complete=table_dict1+table_dict2
In [18]:
table_complete
Out[18]:
[OrderedDict([('Nom', 'Lovelace'),
              ('Prénom', 'Ada'),
              ('année1', '1815'),
              ('année2', '1852'),
              ('domaine', 'Algorithmes et programmation')]),
 OrderedDict([('Nom', 'Kahn'),
              ('Prénom', 'Gilles'),
              ('année1', '1946'),
              ('année2', '2006'),
              ('domaine', 'Algorithmes et programmation')]),
 OrderedDict([('Nom', 'Hooper'),
              ('Prénom', 'Grace'),
              ('année1', '1906'),
              ('année2', '1992'),
              ('domaine', 'Algorithmes et programmation')]),
 OrderedDict([('Nom', 'Berry'),
              ('Prénom', 'Gérard'),
              ('année1', '1948'),
              ('année2', ''),
              ('domaine', 'Algorithmes et programmation')]),
 OrderedDict([('Nom', 'Boole'),
              ('Prénom', 'Georges'),
              ('année1', '1815'),
              ('année2', '1864'),
              ('domaine', 'Mathématiques et informatique')]),
 OrderedDict([('Nom', 'Lions'),
              ('Prénom', 'Jacques-Louis'),
              ('année1', '1928'),
              ('année2', '2001'),
              ('domaine', 'Mathématiques et informatique')]),
 OrderedDict([('Nom', 'Daubechies'),
              ('Prénom', 'Ingrid'),
              ('année1', '1954'),
              ('année2', ''),
              ('domaine', 'Mathématiques et informatique')]),
 OrderedDict([('Nom', "Hypatie d'Alexandrie"),
              ('Prénom', ''),
              ('année1', '355'),
              ('année2', '415'),
              ('domaine', 'Mathématiques et informatique')]),
 OrderedDict([('Nom', 'Shannon'),
              ('Prénom', 'Claude'),
              ('année1', '1916'),
              ('année2', '2001'),
              ('domaine', 'Systèmes et réseaux')]),
 OrderedDict([('Nom', 'Berners-Lee'),
              ('Prénom', 'Tim'),
              ('année1', '1955'),
              ('année2', ''),
              ('domaine', 'Systèmes et réseaux')]),
 OrderedDict([('Nom', 'Turing'),
              ('Prénom', 'Alan'),
              ('année1', '1912'),
              ('année2', '1954'),
              ('domaine', 'Joker')]),
 OrderedDict([('Nom', 'Minsky'),
              ('Prénom', 'Marvin'),
              ('année1', '1927'),
              ('année2', '2016'),
              ('domaine', 'Intelligence artificielle')]),
 OrderedDict([('Nom', 'LeCun'),
              ('Prénom', 'Yann'),
              ('année1', '1969'),
              ('année2', ''),
              ('domaine', 'Intelligence artificielle')]),
 OrderedDict([('Nom', 'Engelbart'),
              ('Prénom', 'Doug'),
              ('année1', '1925'),
              ('année2', '2013'),
              ('domaine', 'Interaction homme-machine')])]

Opération de jointure

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.

In [20]:
fichier_pays=open("sept_familles_informatique_pays.csv")# Ouverture du fichier csv
table_dict_pays=list(csv.DictReader(fichier_pays)) 
table_dict_pays
Out[20]:
[OrderedDict([('Nom', 'Lovelace'),
              ('Prénom', 'Ada'),
              ('Pays', 'Royaume-Uni')]),
 OrderedDict([('Nom', 'Kahn'), ('Prénom', 'Gilles'), ('Pays', 'France')]),
 OrderedDict([('Nom', 'Hopper'), ('Prénom', 'Grace'), ('Pays', 'Etats-Unis')]),
 OrderedDict([('Nom', 'Berry'), ('Prénom', 'Gérard'), ('Pays', 'France')]),
 OrderedDict([('Nom', 'Boole'),
              ('Prénom', 'Georges'),
              ('Pays', 'Royaume-Uni')]),
 OrderedDict([('Nom', 'Lions'),
              ('Prénom', 'Jacques-Louis'),
              ('Pays', 'France')]),
 OrderedDict([('Nom', 'Daubechies'),
              ('Prénom', 'Ingrid'),
              ('Pays', 'Belgique')]),
 OrderedDict([('Nom', "Hypatie d'Alexandrie"),
              ('Prénom', 'Grèce'),
              ('Pays', None)]),
 OrderedDict([('Nom', 'Shannon'),
              ('Prénom', 'Claude'),
              ('Pays', 'Etats-Unis')]),
 OrderedDict([('Nom', 'Berners-Lee'),
              ('Prénom', 'Tim'),
              ('Pays', 'Royaume-Uni')]),
 OrderedDict([('Nom', 'Turing'), ('Prénom', 'Alan'), ('Pays', 'Royaume-Uni')])]

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.

In [50]:
def fusion (element1,element2):
    '''Votre code'''

Créer à présent une fonction permettant de fusionner nos 2 tableaux.

In [54]:
def fusionne_tables(table1, table2):
    '''votre code'''
In [59]:
table_dict_fusion=fusionne_tables(table_dict1,table_dict_pays)
In [60]:
table_dict_fusion
Out[60]:
[{'Nom': 'Lovelace',
  'Pays': 'Royaume-Uni',
  'Prénom': 'Ada',
  'année1': '1815',
  'année2': '1852',
  'domaine': 'Algorithmes et programmation'},
 {'Nom': 'Kahn',
  'Pays': 'France',
  'Prénom': 'Gilles',
  'année1': '1946',
  'année2': '2006',
  'domaine': 'Algorithmes et programmation'},
 {'Nom': 'Berry',
  'Pays': 'France',
  'Prénom': 'Gérard',
  'année1': '1948',
  'année2': '',
  'domaine': 'Algorithmes et programmation'},
 {'Nom': 'Boole',
  'Pays': 'Royaume-Uni',
  'Prénom': 'Georges',
  'année1': '1815',
  'année2': '1864',
  'domaine': 'Mathématiques et informatique'},
 {'Nom': 'Lions',
  'Pays': 'France',
  'Prénom': 'Jacques-Louis',
  'année1': '1928',
  'année2': '2001',
  'domaine': 'Mathématiques et informatique'},
 {'Nom': 'Daubechies',
  'Pays': 'Belgique',
  'Prénom': 'Ingrid',
  'année1': '1954',
  'année2': '',
  'domaine': 'Mathématiques et informatique'},
 {'Nom': 'Shannon',
  'Pays': 'Etats-Unis',
  'Prénom': 'Claude',
  'année1': '1916',
  'année2': '2001',
  'domaine': 'Systèmes et réseaux'},
 {'Nom': 'Berners-Lee',
  'Pays': 'Royaume-Uni',
  'Prénom': 'Tim',
  'année1': '1955',
  'année2': '',
  'domaine': 'Systèmes et réseaux'},
 {'Nom': 'Turing',
  'Pays': 'Royaume-Uni',
  'Prénom': 'Alan',
  'année1': '1912',
  'année2': '1954',
  'domaine': 'Joker'}]