Contexte

La mémorisation des informations dans des tables conduit généralement à éviter d'avoir la même information dans plusieurs tables.

Cependant, il arrive que lors du traitement des informations on ai besoin de plusieurs tables.

On utilise alors une opération de jointure :

jointurePrincipe

Pour y parvenir il faut utiliser une clé commune qui permet de relier les tables.

Dans l'exemple ci-dessus c'est la clé Nom qui est commune.

Comprendre par l'exemple

Tester le code suivant :

#---importation de la fonction deepcopy du module copy
from copy import deepcopy

#---jeu de tables pré-remplies
TableEleve = [{'Nom': 'Joe', 'Anglais': '17', 'Info': '18', 'Maths': '16'},
            {'Nom': 'Zoé', 'Anglais': '15', 'Info': '17', 'Maths': '19'},
            {'Nom': 'Max', 'Anglais': '19', 'Info': '13', 'Maths': '14'},
            {'Nom': 'Jules', 'Anglais': '11', 'Info': '13', 'Maths': '7'}]
ProfilEleve = [{'Nom': 'Joe', 'Age':'16', 'Classe': '12'},
            {'Nom': 'Zoé', 'Age':'15', 'Classe': '12'},
            {'Nom': 'Max', 'Age':'17',  'Classe': '13'},
            {'Nom': 'Jules', 'Age':'16',  'Classe': '13'}]

#=============Définition des fonctions=================
#------Fonction jointure de 2 tables
#table1, table2 : nom des tables
#clef : clé commune permettant de relier les 2 tables
def jointure(table1, table2, clef):
    new_table = []
    for ligne1 in table1:
        for ligne2 in table2:
            if ligne1[clef] == ligne2[clef]:
                new_line = deepcopy(ligne1)
                for cle in ligne2:
                    if cle != clef:
                        new_line[cle] = ligne2[cle]
                new_table.append(new_line)
    return new_table
          
#======Programme principal=============================
#---essai fonction jointure()
resu = jointure(ProfilEleve, TableEleve, 'Nom')
print(resu)

a- Dans la fonction jointure(), quel est le type de données de ligne1 ?

Type données de ligne1 :
Tuple
Tuple de liste
Liste
Liste de dictionnaire
Tuple de dictionnaire
Dictionnaire
Tuple de liste de dictionnaire

b- Echanger l’ordre des tables dans l’appel de la fonction jointure(TableEleve, ProfilEleve,'nom').

c- Conclusion sur l'importance de l'ordre des tables ?

Quelles différences entre = et deepcopy() ?

L'objectif est de comprendre comment les données sont mémorisées lors d'une copie de variables.

- Il est courant de faire une copie de variable dit par affectation : VarA = VarB

- il est possible d'utiliser une copie profonde : VarA = deepCopy(VarB)

A la ligne 23 du code précédent, l'instruction est : new_line = deepcopy(ligne1)

En fait le code peut fonctionner aussi avec new_line = ligne1, mais il y a un problème !

Pour comprendre ce qui ne va pas :

- tester de nouveau le programme précédent (avec deepcopy()) et dans la console afficher la variable ProfilEleve.

- tester de nouveau le programma précédente mais en mettant new_line = ligne1 et dans la console, afficher la variable ProfilEleve.

- Que constatez-vous ?

Ce que vous venez de mettre en évidence provient de la manière dont les copie de variables se font.
Avec une affactation, le contenu de la variable de départ n'est pas copiée : un lien est créé entre la nouvelle variable et le contenu de l'ancienne variable.