Pré-requis indispensable : être à l'aise avec la notion de tableau vu au chapitre précédent, et comment créer un tableau, le modifier, s'adresser à un de ses éléments, les parcourir, ...
Dans le cas contraire : revoir le chapitre !!
Vous avez vu aux chapitres précédents la notion de tableaux, correspondant au type list
de Python.
Il existe également dans de nombreux langages de programmation des tableaux à deux dimensions, c'est à dire des types construits organisés en "lignes" et en "colonnes" : chaque case située à l'intersection d'une ligne et d'une colonne correspond alors à un élément dans lequel peut être stockée une information.
Ces "lignes" et ces "colonnes" ne sont en fait qu'un moyen commode de se représenter cette organisation des données, mais ce type de données correspond en réalité à des "tableaux de tableaux", c'est à dire des tableaux dont les éléments eux-mêmes sont des tableaux ! On utilisera plutôt le terme de matrice.
Les matrices ont de nombreuses applications comme par exemple :
Un exemple pourrait se présenter sous cette forme :
matrice = [[0,1,2,3],
[4,5,6,7],
[8,9,10,11],
[12,13,14,15]]
On retrouve les crochets déjà utilisés pour définir un tableau et les virgules séparant les différents éléments...
Les sauts de ligne sont là pour structurer l'affichage ci-dessus de la matrice de façon à ce qu'elle ressemble effectivement à un tableau avec des "lignes" et des "colonnes"; mais en réalité, ces sauts ne sont pas à faire figurer.
Cette matrice doit en réalité être écrite ainsi :
matrice = [[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]]
Pour adresser une "ligne" complète d'un tableau, ( donc un des "sous-tableau" ), on utilise la notation déjà vue : un élément est repéré par son index donnant sa position dans la tableau.
print(matrice[2]) # soit : afficher la ligne d'index 2
>>> [8,9,10,11]
print(matrice[0])
>>> [0,1,2,3]
Une "case" de la tableau ( donc un élément dans une des "sous-tableau'... ) devra par contre être repérée par deux index : le numéro de la "ligne" et le numéro de la "colonne" où il est stocké.
on donne toujours le numéro de la ligne en premier selon la syntaxe suivante :
nom_de_la_matrice[ligne][colonne]
Exemples :
print(matrice[2][0]) # soit : afficher le premier élément de la ligne d'index 2
>>> 8
print(matrice[2][2])
>>> 10
Pas évident !! Il faudra bien y faire attention...
Impossible à faire directement...Il faudra parcourir la matrice ( cf plus bas ).
Il est égal aux nombres de "sous-tableaux", donc au nombre d'éléments de la matrice :
matrice = [[0,1,2],[4,5,6],[8,9,10],[12,13,14]]
lignes = len(matrice)
print(lignes)
>>> 4
Il est égal aux nombres d'éléments dans chaque sous-tableau; puisque toutes les "lignes" ont le même nombre de "colonnes", il suffit donc de regarder le nombre d'éléments qu'il y a, par exemple, dans le premier "sous-tableau" :
matrice = [[0,1,2],[4,5,6],[8,9,10],[12,13,14]]
colonnes = len(matrice[0])
print(matrice)
>>> 3
A votre avis ? On fait comment ??
A part la définition complète comme dans l'exemple ci dessus, on peut également créer une matrice par compréhension.
Vous avez déjà vu ça au chapitre sur les tableaux., mais pour une matrice, la construction nécessitera deux boucles : la première pour parcourir les "colonnes", la deuxième pour les "lignes."
Exemples :
Pour la construction précédente, l'équivalent du code serait :
matrice = [[0 for j in range(4)] for i in range(5)] # boucle j = "colonnes" / boucle i = "lignes"
print(matrice)
>>> [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
Pour obtenir dans une matrice les tables de multiplication de 1 à 9 :
tableau = [[i*j for j in range(1,10)] for i in range(1,10)]
print(matrice)
>>> [[1, 2, 3, 4, 5, 6, 7, 8, 9], [2, 4, 6, 8, 10, 12, 14, 16, 18], [3, 6, 9, 12, 15, 18, 21, 24, 27], [4, 8, 12, 16, 20, 24, 28, 32, 36], [5, 10, 15, 20, 25, 30, 35, 40, 45], [6, 12, 18, 24, 30, 36, 42, 48, 54], [7, 14, 21, 28, 35, 42, 49, 56, 63], [8, 16, 24, 32, 40, 48, 56, 64, 72], [9, 18, 27, 36, 45, 54, 63, 72, 81]]
Méthode très puissante à condition de bien savoir ce que l'on doit écrire !
Comme pour le parcours d'un tableau "simple" il y a également deux méthodes, qui utilisent toutes les deux deux boucles imbriquées :
tableau = [[0,1,2,3],[4,5,6,7],[8,9,10,11]]
for ligne in tableau : # boucle sur les "lignes"
for element in ligne : # boucles sur les éléments de chacune des "lignes"
print(element, end =' ')
>>> 0 1 2 3 4 5 6 7 8 9 10 11
tableau = [[0,1,2,3],[4,5,6,7],[8,9,10,11]]
lignes = len(tableau) # nombre d'éléments dans la matrice = nombre de "lignes"
colonnes = len(tableau[0]) # nombre d'éléments dans le premier sous-tableau = nombre de "colonnes" !
for l in range(lignes) : # boucle sur les "lignes"
for c in range(colonnes) : # boucles sur les "colonnes"
print(tableau[l][c]) # affichage de l'élément à la ligne l et à la colonne c
>>> 0 1 2 3 4 5 6 7 8 9 10 11
La deuxième méthode semble plus compliquée, mais c'est la seule qui permette en plus de modifier les éléments de la matrice ( c'est impossible avec la première méthode ).
Construire, puis afficher les matrices suivantes :
matrice = [[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]]
A partir de la matrice créée à la deuxième question de l'exercice 2.4.1 :
[0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]
[12, 13, 14, 15]
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
0 4 8 12
1 5 9 13
2 6 10 14
3 7 11 15
Sur la base de l'algorithme de parcours de tableau, nous pouvons également travailler maintenant avec les matrices.
Nous allons utiliser un exemple concret de recherche dans une matrice contenant "beaucoup" de données.
Pour cela téléchargez le fichier liste-des-communes-2019.csv. Il contient la liste des communes françaises, ainsi que leur population en 2019 et
leur rang dans le classement des populations, sans ex-æquo.
Le code ci-dessous permet de transférer toutes ces données dans une matrice ( un tableau de tableaux ).
import csv
liste=[]
with open("liste-des-communes-2019.csv",'r',encoding='utf-8') as f:
lecteur=csv.reader(f,delimiter=';')
for ligne in lecteur:
liste.append([int(ligne[0]),ligne[1],int(ligne[2])])
Chaque "ligne" de la matrice correspond à une ville; les données sont classées dans cet ordre : rang, nom de commune, population.
Un affichage d'un extrait de la matrice donnera :
[11, 'Rennes', 216268]
[12, 'Reims', 183113]
[13, 'Saint-Étienne', 171924]
Vous avez a votre disposition une grande série de données et vous avez vu les algorithmes permettant de calculer une moyenne un maximum (ou un minimum...).
Vous devez coder un programme qui répondra aux questions suivantes :
Votre programme devra être structuré en fonctions.
Question :
Quelle est la complexité de la recherche d'une valeur dans une matrice ?