Tableaux et matrices
Introduction :
Dans ce cours nous allons étudier les principales structures de données, également appelées types construits. Ces structures sont destinées à regrouper et à manipuler des ensembles de données. Nous étudierons successivement les p-uplets ou tuples, puis les tableaux appelés listes et enfin les dictionnaires.
Tuples
Tuples
Commençons par étudier la structure de données de type tuple ou p-uplet.
- En mathématiques un p-uplet est un ensemble d'éléments ordonnés de p éléments, p étant un entier naturel non nul. Cet ensemble est parfois noté n-uplet ou encore tuple, ce dernier terme étant d'origine anglo-saxonne.
Le concept de n-uplet a été implémenté dans le langage Python sous le nom de tuple.
Tuple :
Un tuple est une séquence ordonnée et finie d'éléments.
Création de tuples
Création de tuples
La déclaration d'un tuple s'effectue par énumération des éléments séparés par une virgule.
Un tuple peut aussi contenir des éléments hétérogènes.
L'emploi des parenthèses est optionnel pour la création d'un tuple, sauf dans deux cas particuliers :
- la création d'un tuple vide ;
- la création d'un tuple contenant un seul élément.
- La déclaration d'un tuple contenant un seul élément nécessite l'ajout d'une virgule pour ne pas être confondu avec une déclaration de variable non composée telle qu'un nombre ou une chaîne de caractères.
Itération sur les tuples
Itération sur les tuples
L'itération sur les tuples s'effectue avec la construction
.Produit l'affichage suivant :
Accès aux éléments d'un tuple
Accès aux éléments d'un tuple
Les éléments individuels d'un tuple sont accessibles avec la notation indicielle.
L’indice du premier élément d’un tuple est $0$ et non $1$. Il en est de même pour le premier élément d’une liste.
Immutabilité des tuples
Immutabilité des tuples
Les tuples sont immutables. Il n'est donc pas possible d'ajouter ou de supprimer un élément composant le tuple.
Il n'est pas non plus possible de modifier un élément du tuple. Python génère une erreur si on tente une telle assignation.
Par exemple,
déclenche l'affichage d'une erreur.Tuples et retours multiples dans une fonction
Tuples et retours multiples dans une fonction
En Python, une fonction peut retourner simultanément plusieurs valeurs, constituant un tuple.
On demande l'affichage d'un appel de cette fonction.
Nous pouvons assigner le résultat de cette fonction à une variable.
Demandons à Python d'afficher le type de variable.
Il s'agit bien d'un tuple. Nous pouvons également effectuer des assignations multiples à partir d'un tuple.
Le type de la variable « minuscules » est celui du premier élément composant le tuple. Dans le cas présent c'est une chaîne de caractères.
Le tuple accepte de contenir des éléments hétérogènes. Nous pouvons les employer pour stocker des données de différents types.
Le tuple n'indique cependant pas quelle donnée est stockée à quel emplacement. Il existe une solution pour pallier cette limitation des tuples classiques : l'emploi de tuples nommés.
Tuples nommés
Tuples nommés
Les tuples nommés conservent les caractéristiques des tuples classiques mais apportent le bénéfice de pouvoir nommer les attributs composant le tuple.
Tuples nommés :
Les tuples nommés sont une sous-classe des tuples dont les valeurs sont nommées.
Le module « collections » de la bibliothèque standard de Python propose une classe d'objets tuples nommés, mobilisables par un simple import.
On définit un nouveau type de tuple nommé en déclarant :
- son nom ;
- la liste des noms de ses attributs.
On peut ensuite créer des tuples nommés d'élèves avec les caractéristiques choisies, avec ou sans le recours au nom des attributs.
On peut noter que dans le cas du recours au nom des attributs, l’ordre d’affectation n’est pas imposé. Ainsi, on aurait pu définir la variable « paul » de cette manière :
L'affichage de la variable "alice" propose le tuple nommé au complet c’est-à-dire les noms des attributs accompagné des valeurs qui y sont rattachées.
L'autre intérêt du tuple nommé est de pouvoir accéder aux attributs par leur nom.
Les tuples et les tuples nommés sont des conteneurs immutables pouvant réunir des éléments hétérogènes. L'absence de mutabilité peut s'avérer problématique dans certains cas.
Intéressons-nous maintenant à des structures de données mutables : d'abord les listes puis les dictionnaires.
Listes
Listes
Les tableaux, appelés listes en Python, sont des structures de données mutables. Ce sont également des structures de données ordonnées. Ces deux caractéristiques les rendent très utiles pour de nombreux usages.
Listes :
Les listes sont des structures de données ordonnées et mutables.
Création de listes
Création de listes
La création de liste s'effectue par énumération des éléments composant la liste.
Itération sur les listes
Itération sur les listes
L'itération sur les listes s'effectue avec la construction
.Produit l'affichage suivant :
$\text{Alice}$
$\text{Charles}$
$\text{Paul}$
Elle peut également être effectuée avec la notation indicielle.
Accès aux des éléments d'une liste
Accès aux des éléments d'une liste
La notation indicielle permet l'accès aux éléments individuels d'une liste.
Modification d'un élément d'une liste
Modification d'un élément d'une liste
Le caractère mutable des listes permet d'en modifier les éléments.
Suppression d'un élément d'une liste
Suppression d'un élément d'une liste
La suppression d'un élément s'effectue avec l'instruction
.Ajout d'un élément à la fin d’une liste
Ajout d'un élément à la fin d’une liste
L'ajout d'un élément à la fin d’une liste s'effectue avec l'instruction
.Listes imbriquées
Listes imbriquées
Les listes peuvent être composées de listes. Il est ainsi possible de créer et de manipuler des listes imbriquées.
Créons une matrice en imbriquant des listes.
Pour une meilleure lisibilité, il est également possible d'employer cette présentation.
L'accès aux éléments individuels est possible de manière indicielle. On précise la position dans le premier niveau de liste, puis celle dans la liste imbriquée.
Nous avons abordé les principales manipulations avec les listes. Il existe toutefois une autre manière de composer des listes, par compréhension.
Listes en compréhension
Listes en compréhension
Nous consacrons une partie spécifique aux listes en compréhension. Il s'agit de listes en tous points identiques à celles que nous venons d'étudier, mais que nous construisons d'une manière différente. Illustrons cela avec un exemple.
Nous souhaitons générer la liste des nombres pairs inférieurs ou égaux à dix. Commençons de manière classique en effectuant une boucle et en utilisant un test conditionnel.
Vérifions que notre programme fonctionne bien.
La création de liste en compréhension permet d'obtenir le même résultat avec un code beaucoup plus compact puisqu'il tient en une seule ligne.
Vérifions le résultat obtenu :
Une liste en compréhension se génère entre crochets. Elle inclut une expression suivie d'au moins une clause
et optionnellement d'autres clauses ou .Filtrage conditionnel
Filtrage conditionnel
Le filtrage conditionnel est tout à fait possible en compréhension de liste.
Il est également possible d'appliquer des conditions multiples ou des choix alternatifs. Dans ce cas, la partie conditionnelle doit être placée avant la boucle
.- Si un prénom ne comporte pas le caractère « o » il est remplacé par « Anonyme ».
$$
- Sélection des prénoms courts comportant le caractère « o ».
Il est possible d'écrire une liste par compréhension sur plusieurs lignes pour mieux en distinguer les composantes.
Expressions complexes
Expressions complexes
Les expressions au cœur de l'itération des listes en compréhension peuvent être complexes et faire appel à des fonctions.
Imbrication de listes en compréhensions
Imbrication de listes en compréhensions
L'ordre des boucles est celui qui serait utilisé pour générer la liste sans compréhension. La boucle extérieure s'écrit donc avant la boucle intérieure dans la compréhension de liste.
Transposition de matrice
Transposition de matrice
Une matrice :
Une matrice, en mathématiques, est un tableau de nombres qui permet de traiter globalement un ensemble de calculs identiques.
Une matrice de format ou dimension $(n ; p)$ est un tableau rectangulaire de nombres comportant $n$ lignes et $p$ colonnes. Ces nombres sont appelés les coefficients ou les termes de la matrice.
La matrice transposée d’une matrice $\text{A}$ de format $(n ; p)$ est la matrice de format $(p ; n)$, noté $\text{A}^{\text{T}}$, obtenue en échangeant les lignes et les colonnes de $\text{A}$.
La formulation par compréhension de listes nous permet de réaliser une transposition de matrice avec un code compact.
Vérifions le résultat obtenu.
Vous pouvez noter au passage que la longueur d’une liste est donnée par la fonction
, comme pour la longueur d’une chaîne de caractères, d’un tuple ou d’un dictionnaire. Le code équivalent sans compréhension de liste est plus long et sa lisibilité n'est pas meilleure.Les listes par compréhension offrent d'intéressants raccourcis syntaxiques pour la génération et le traitement de listes. Elles sont à la fois d'une plus grande compacité et restent bien lisibles avec une syntaxe proche du langage naturel.
Dictionnaires
Dictionnaires
Les dictionnaires ressemblent aux listes par certains aspects, mais diffèrent par d'autres. Ainsi, les listes sont indexées par des nombres, tandis que les dictionnaires ont recours à des clés nommées, qui ne sont pas nécessairement des nombres. Dans d'autres langages, les dictionnaires sont appelés tableaux associatifs. Comme les listes, les dictionnaires sont mutables.
Dictionnaires :
Les dictionnaires sont des ensembles mutables, non ordonnés, de paires composées d'une clé et d'une valeur en correspondance.
La manipulation des dictionnaires présente de nombreuses similitudes avec celles des tuples et des listes étudiés précédemment.
Création d'un dictionnaire
Création d'un dictionnaire
La création d'un dictionnaire s'effectue par énumération des paires de clés et de valeurs associées, le tout étant encadré par des accolades.
Comme pour les listes, il est possible de présenter ce code sur plusieurs lignes pour mieux identifier les paires clé-valeur composant le dictionnaire.
Accès aux éléments d'un dictionnaire
Accès aux éléments d'un dictionnaire
La consultation du dictionnaire avec une clé permet d'obtenir la valeur correspondante.
Si la clé n'existe pas, une erreur survient.
Ajout d'éléments
Ajout d'éléments
L'ajout de nouveaux éléments s'effectue par affectation d'une valeur à une nouvelle clé.
Modification d'un élément
Modification d'un élément
Si la clé existe déjà, une nouvelle affectation de valeur remplace l'ancienne.
Suppression d'éléments
Suppression d'éléments
La suppression de l’élément d’un dictionnaire s'effectue, comme pour les listes, avec l'instruction del.
Si on tente de supprimer une clé inexistante, une erreur survient.
Itérations sur les dictionnaires
Itérations sur les dictionnaires
Les itérations sur les dictionnaires peuvent porter sur les clés, sur les valeurs, ou sur les deux en même temps.
Pour le découvrir prenons comme exemple celui des métadonnées accompagnant une image.
Voyons dans un premier temps l'itération sur les clés.
Produit l'affichage suivant :
- Seules les clés sont affichées.
Voyons maintenant l'itération sur les valeurs.
Produit l'affichage suivant :
- Les valeurs sont affichées, mais pas les clés.
L'itération simultanée sur les clés et les valeurs s'effectue ainsi :
Produit l'affichage suivant :
L’usage de paires clé-valeur étant très répandu, les dictionnaires sont des structures de données fréquemment employées dans les développements informatiques.
Conclusion :
Les tuples, les listes et les dictionnaires sont des structures de données distinctes, dotées chacune de caractéristiques propres : les tuples sont ordonnés et non mutables, les listes sont ordonnées et mutables et les dictionnaires sont non-ordonnés et mutables. Les tuples peuvent être nommées, se rapprochant ainsi du principe des clés du dictionnaire, alors que les listes ne peuvent pas être nommées.
Le choix d'une structure de donnée dépend des besoins et des usages souhaités. On s'interrogera notamment sur la nécessité ou non de disposer de structures mutables ou ordonnées et sur la manière dont on souhaite y accéder.