C12 Les tableaux en Python ⚓︎
Notion de tableau, indices⚓︎
En informatique (comme ailleurs...), un tableau permet de stocker de façon structurée plusieurs valeurs, en général de même type.
Remarque :
même si Python l'autorise, il n'y a pas beaucoup de situations où on va créer un tableau avec des valeurs de types différents.
Voici comment on se représente traditionnellement un tableau de 6 entiers, avec des cases (ou cellules):
Bien entendu, il faut stocker ce tableau dans un variable et lui donner un nom. Appelons-le t
. Ce tableau est ordonné, le premier élément est 4, le deuxième est 2, et le dernier est 12.
On repère chaque élément du tableau par sa position, le numéro de la case, qu'on appelle indice.
Généralement, on utilise la notation t[i]
pour désigner l'élement d'indice i
du tableau t
. Par exemple, dans notre exemple, t[3]
contient la valeur 42.
Enfin la taille ou longueur d'un tableau est le nombre d'éléments qu'il contient. Ici le tableau t
a une taille égale à 6.
Les tableaux en Python⚓︎
ATTENTION :
Dans la suite nous allons employer le terme «tableau». Pour parler de ces «tableaux» les concepteurs de Python ont choisi d'utiliser le terme de «list» («liste» en français).
Pour éviter toute confusion, notamment par rapport à des notions qui seront abordées en terminale, le choix a été fait d'employer «tableau» à la place de «liste» (dans la documentation vous rencontrerez le terme «list», cela ne devra pas vous pertuber)
Les tableaux sont des séquences, ils sont modifiables (on parle d'objets «mutables»).
En Python, on implémente le type abstrait de tableau par le type list
.
On définit un tableau avec des crochets et on sépare ses éléments par des virgules. Par abus de langage on parle de liste plutôt que de tableau
✒ Déclaration d'une liste ou d'un tableau⚓︎
Exemples
famille = ["Bart", "Lisa", "Maggie"]
print(famille)
['Bart', 'Lisa', 'Maggie']
Remarques :
-
Même si cela n'a ici un grand intérêt, les éléments d'une liste peuvent donc être de types différents : ici, tous les éléments de ma liste sont des chaînes de caractères (
str
), mais la liste["Bart", 5, "Lisa", "Maggie"]
est aussi une liste valide. -
Une liste vide se déclarera avec
[]
.
copies_corrigees = []
Nous verrons plus tard qu'il est fréquent dans les exercices de partir d'une liste vide et d'ajouter progressivement des éléments.
Définition : listes en python
Une liste est un ensemble de valeurs, regroupées en un seul objet.
Exemples :
lst1 = [2, 1, 7, 0] # lst est une liste de nombres entiers
lst2 = [2.1, 1.1, 7.5, 0.36] # lst est une liste de float
lst3 = ["albert", "paul", "jacques"] # lst est une liste de str
# mais une liste peut contenir des éléments de types différents :
lst4 = ["1G4","NSI", 22, 13.7, True] # cette liste contient des éléments de différents types.
✒ Accés aux élèments d'une liste⚓︎
On accède à un élément d'une liste en mettant entre crochets l'indice de l'élément (qui commence à zéro).
>>>famille[0]
'Bart'
>>>famille[2]
'Maggie'
>>>famille[3]
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: list index out of range
Remarques :
-
Un indice qui dépasse la valeur
longueur de la liste -1
provoquera donc une erreurlist index out of range
. C'est une erreur très fréquente lorsqu'on manipule des listes. -
Il est par contre possible d'utiliser des indices négatifs. On utilise par exemple très souvent l'indice -1 pour accéder au dernier élément de la liste, sans avoir à connaître la longueur de celle-ci :
>>>famille[-1]
'Maggie'
Définitions : Indices des éléments d'une liste
Les éléments d'une listes sont numérotés, on dit indicés.
- Le premier élément a li'ndice 0
- Le second élément a li'ndice 1
- Le troisième élément a li'ndice 2
etc...
remarque très importante :
L'indice du dernier élément est égal à len(lst) - 1
Par exemple si la liste à 4 élément, ils ont les indices \(0\), \(1\), \(2\) et \(3\), la longueur de la liste est \(4\)
notations :
Souvent, quand nous travaillerons avec des listes, nous les représenterons avec des cases pour les éléments, et les indices reportés (au dessus ou en dessous) :
Les indices permettent d'accéder à la valeur des éléments :
lst[0] est le premier élément de la liste
lst[1] est le second élément de la liste
lst[2] est le troisième élément de la liste
ect
Le dernier élément d une liste de longueur 6 à l indice 5
✒ Longueur d'une liste⚓︎
La longueur d'une liste sera donnée par la fonction len()
, qui renvoie donc un nombre entier positif ou nul.
>>>len(famille)
3
maliste
(non vide) sera donc toujours l'élément d'indice len(maliste)-1
.
>>>famille[len(famille) - 1]
'Maggie'
>>>famille[len(famille)]
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: list index out of range
✒ Parcours des éléments d'une liste⚓︎
Il existe principalement deux méthodes pour parcourir une liste: par ses éléments ou par les indices. Mais dans les deux cas on utilise une boucle for
.
Parcours «par éléments»
C'est la méthode la plus naturelle, celle déjà vue lors de la présentation de la boucle for
. Nous allons simplement itérer sur les éléments de la liste.
On l'a déjà rencontré sur la boucle for
:
famille = ["Bart", "Lisa", "Maggie"]
for membre in famille:
print(membre)
Bart
Lisa
Maggie
Remarque :
- Penser à donner un nom signifiant à la variable qui parcourt la liste. Il aurait par exemple été très maladroit d'écrire
for k in famille:
print(k)
Bart
Lisa
Maggie
En effet le nom de variable k
est habituellement utilisé pour les nombres (les indices, les compteurs...).
Exo
Après un référendum, la liste urne
contient uniquement des 'oui'
ou des 'non'
.
Déterminer le pourcentage de oui
de ce référendum.
urne = ['oui', 'non', 'non', 'oui', 'oui', 'oui', 'non', 'oui', 'oui', 'oui', 'non', 'oui', 'non', 'non', 'oui', 'non', 'non', 'oui', 'oui', 'oui', 'oui', 'non', 'non', 'oui', 'non', 'oui', 'non', 'non', 'non', 'oui', 'oui', 'oui', 'oui', 'non', 'oui', 'non', 'non', 'oui', 'non', 'non', 'oui', 'non', 'non', 'non', 'non', 'non', 'non', 'non', 'oui', 'non', 'non', 'oui', 'oui', 'non', 'oui', 'oui', 'oui', 'oui', 'oui', 'oui', 'non', 'non', 'oui', 'oui', 'oui', 'oui', 'non', 'non', 'non', 'oui', 'oui', 'oui', 'non', 'non', 'non', 'non', 'oui', 'non', 'non', 'non', 'non', 'non', 'non', 'non', 'non', 'oui', 'non', 'oui', 'non', 'non', 'oui', 'oui', 'non', 'non', 'non', 'oui', 'oui', 'non', 'oui', 'oui', 'non', 'non', 'oui', 'oui', 'oui', 'non', 'oui', 'non', 'oui', 'oui', 'oui', 'oui', 'oui', 'non', 'non', 'non', 'non', 'oui', 'oui', 'oui', 'non', 'oui', 'non', 'oui', 'oui', 'oui', 'oui', 'oui', 'non', 'non', 'oui', 'non', 'non', 'non', 'non', 'non', 'non', 'oui', 'non', 'non', 'oui', 'non', 'non', 'oui', 'non', 'non', 'oui', 'oui', 'oui', 'oui', 'oui', 'oui', 'non', 'oui']
Avantages et inconvénients du Parcours par élément
for membre in famille:
print(membre)
Les avantages :
- la simplicité : un code plus facile à écrire, avec un nom de variable explicite.
- la sécurité : pas de risque d'
index out of range
!
Les inconvénients :
- méthode rudimentaire : lorsqu'on est «positionné» sur un élément, il n'est pas possible d'accéder au précédent ou au suivant. (et c'est parfois utile).
- on n'accéde pas à la position (indice) de l'élément.
- on ne peut pas modifier l'élément sur lequel on est positionné :
lst = [1, 2, 3]
for nb in lst:
nb = nb * 2 # (1)
lst
[1, 2, 3]
- On veut multiplier par 2 chaque élément de la liste
- La liste
lst
n'a pas changé...
Parcours «par indice»
Chaque élément étant accessible par son indice (de 0
à len(liste) - 1
), il suffit de faire parcourir à une variable i
l'ensemble des entiers de 0
à len(liste) - 1
, par l'instruction range(len(liste))
:
famille = ["Bart", "Lisa", "Maggie"]
for i in range(len(famille)):
print(famille[i])
Bart
Lisa
Maggie
Bonne habitude à prendre : nommer sa variable d'indice i
, j
, k
ou indice
mais pas autre chose !
Avantages et inconvénients du Parcours par indice
for i in range(len(famille)):
print(famille[i])
Les avantages :
- le contrôle : en parcourant par indice, on peut s'arrêter où on veut, on peut accéder au suivant/précédent...
- pour les tableaux à deux dimensions, on retrouve la désignation classique d'un élément par numéro de ligne / numéro de colonne.
Les inconvénients :
- la complexité : il faut connaître le nombre d'éléments de la liste (ou le récupérer par la fonction
len()
) - le risque d'erreur : encore et toujours le
index out of range
...
FICHE : les listes
définition
Une liste est un ensemble de valeurs, regroupées en un seul objet.
exemples :
lst1 = [2, 1, 7, 0] # lst est une liste de nombres entiers
lst2 = [2.1, 1.1, 7.5, 0.36] # lst est une liste de float
lst3 = ["albert", "paul", "jacques"] # lst est une liste de str
# mais une liste peut contenir des éléments de types différents :
lst4 = ["1G4","NSI", 22, 13.7, True] # cette liste contient des éléments de différents types.
type : une liste à le type list
indices
Les éléments d'une listes sont numérotés, on dit indicés.
- Le premier élément a l'indice 0
- Le second élément a li'ndice 1
- Le troisième élément a li'ndice 2
etc...
** remarque très importante :**
L'indice du dernier élément est égal à len(lst) - 1
modifier l'élément d'indice i
Il suffit d'affecter une valeur à l'élement d'indice i
lst = ["a", "b", "c"]
lst[1] = "e" # maintenant lst vaut : ["a", "e", "c"]
longueur
La fonction len() renvoie la longueur d'une liste :
lst = [1, 2, 3]
nombre_elements = len(lst) # nombre d'élément prendra la valeur 3
Parcours par indice
ce code est à connaitre SANS AUCUNE HESITATION
for i in range(len(lst)) :
print( lst[i] )
on peut aussi modifier tout les éléments grâce à un parcours :
lst = [1, 2, 3]
for i in range(len(lst)) :
lst[i] = 2 * lst[i] # maintenant lst vaut : [2, 4, 6]
Parcours par valeur
ce code est à connaitre SANS AUCUNE HESITATION
for elt in lst :
print(elt)
exemple :
lst = [1, 2, 3]
for elt in lst :
print(3*elt)
3
6
9
Exo
On donne la liste :
lst = [3, 1, 4, 1, 5, 9]
En utilisant un parcours par indice :
- Afficher les éléments de cette liste.
- Afficher les éléments de cette liste dans l'ordre inverse (en commençant par 9)
Exo
Trouvez le nombre qui est exactement à la même place dans la liste list1
et dans la liste list2
, sachant que :
- les deux listes ont la même taille
- vous n'avez droit qu'à une seule boucle
for
.
list1 = [8468, 4560, 3941, 3328, 7, 9910, 9208, 8400, 6502, 1076, 5921, 6720, 948, 9561, 7391, 7745, 9007, 9707, 4370, 9636, 5265, 2638, 8919, 7814, 5142, 1060, 6971, 4065, 4629, 4490, 2480, 9180, 5623, 6600, 1764, 9846, 7605, 8271, 4681, 2818, 832, 5280, 3170, 8965, 4332, 3198, 9454, 2025, 2373, 4067]
list2 = [9093, 2559, 9664, 8075, 4525, 5847, 67, 8932, 5049, 5241, 5886, 1393, 9413, 8872, 2560, 4636, 9004, 7586, 1461, 350, 2627, 2187, 7778, 8933, 351, 7097, 356, 4110, 1393, 4864, 1088, 3904, 5623, 8040, 7273, 1114, 4394, 4108, 7123, 8001, 5715, 7215, 7460, 5829, 9513, 1256, 4052, 1585, 1608, 3941]
Exo
Dans la liste
lst = [2428970, 1518306, 4971405, 1690994, 7918102, 4030834, 8830131, 7514856, 7903128, 6307569, 6624056, 5260490, 6447835, 4598783, 9108626, 5045240, 4128269, 4460134, 2497873, 5076659, 8104003, 7604887, 7451976, 4136924, 5691945, 8726293, 7855592, 3562473, 8849129, 6488474, 5303587, 2606124, 5484044, 4559758, 7592232, 2211406, 9974334, 7988936, 7582946, 7668748, 1799997, 3837917, 3196209, 7064342, 2543765, 1182013, 7253381, 1153735, 1037391, 4375946, 4445821, 5965587, 6001887, 4162629, 5235783, 8716582, 4901175, 5445422, 1120005, 8332321, 7075046, 2194175, 5557300, 2887907, 5103214, 2520744, 5104399, 2065665, 3035703, 7890213, 1758301, 3407982, 1355453, 4896338, 7979392, 9671602, 9690721, 7423779, 7423780, 3080825, 6785783, 3836837, 7310931, 1857470, 3492507, 2823231, 1492310, 1911148, 9620515, 5564910, 7009452, 7464745, 9608747, 7267383, 6939140, 6556578, 3592267, 8135497, 4881660, 5346884, 6859150]
se cachent deux nombres consécutifs. Pouvez-vous les trouver ?
✒ Modification d'une liste⚓︎
En Python, les objets de type list
sont modifiables (on emploie le mot mutable). Et c'est souvent une bonne chose, car des listes peuvent évoluer après leur création.
Modification d'un élément existant
On modifie un élément du tableau par simple affectation, en écrasant sa valeur avec la nouvelle.
famille = ["Bart", "Lisa", "Maggie"]
famille[0] = "Bartholomew" # oui, c'est son vrai nom
print(famille)
['Bartholomew', 'Lisa', 'Maggie']
Ajout d'un élement à la fin d'une liste : la méthode append()
On modifie un élément du tableau par simple affectation, en écrasant sa valeur avec la nouvelle.
famille = ["Bart", "Lisa", "Maggie"]
famille.append("Milhouse")
print(famille )
['Bart', 'Lisa', 'Maggie', 'Milhouse']
Remarques :
- La méthode
append()
rajoute donc un élément à la fin de la liste. - Dans beaucoup d'exercices, on part d'une liste vide
[]
que l'on remplit peu à peu avec desappend()
. - (HP) Il est possible d'insérer un élément à la position
i
avec la méthodeinsert
:
famille = ["Bart", "Lisa", "Maggie"]
famille.insert(1, "Nelson") # on insère à la position 1
print(famille)
['Bart', 'Nelson', 'Lisa', 'Maggie']
Exo
Construire une liste contenant tous les nombres inférieurs à 100 qui sont divisibles par 7.
Suppression d'un élément d'une liste par la méthode remove()
famille = ['Bart', 'Nelson', 'Lisa', 'Maggie']
famille.remove("Nelson")
print(famille)
['Bart', 'Lisa', 'Maggie']
Remarques :
- Attention,
remove
n'enlève que la première occurrence de l'élément désigné. S'il y en a d'autres après, elles resteront dans la liste :
lst = [3, 1, 4, 5, 1, 9, 4]
lst.remove(4)
print(lst)
[3, 1, 5, 1, 9, 4]
- Si l'élément à supprimer n'est pas trouvé, un message d'erreur est renvoyé :
lst = [3, 1, 4, 5, 1, 9]
lst.remove(2)
Traceback (most recent call last):
File "<input>", line 2, in <module>
ValueError: list.remove(x): x not in list
✒ Exercices⚓︎
Exo
On considère la liste
temp = [11, 28, -16, -18, -10, 16, 10, 16, 2, 7, 23, 22, -4, -2, 19, 16, 22, -8, 18, -14, 29, -1, 16, 22, -5, 6, 2, -4, 9, -17, -13, 22, 14, 24, 22, -9, -18, -9, 25, -11, 17, 17, 25, -10, 2, -18, 29, 14, -16, 7]
Construire la liste temp_pos
qui ne contient que les éléments positifs de temp
.
Exercice 7. BNS - EP
Programmer la fonction recherche(tab: list, n: int) -> int
, prenant en paramètre un tableau non vide tab
(type list
) d'entiers et un entier n
, et qui renvoie l'indice de la dernière occurrence de l'élément cherché. Si l'élément n'est pas présent, la fonction renvoie la longueur du tableau.
Exemples :
>>> recherche([5, 3],1)
2
>>> recherche([2,4],2)
0
>>> recherche([2,3,5,2,4],2)
3
Exo
On considère la liste lst = [51, 52, 66, 91, 92, 82, 65, 53, 86, 42, 79, 95]
. Seuls les nombres entre 60 et 90 ont une signification : ce sont des codes ASCII (récupérables par la fonction chr
).
Créer une liste sol
qui contient les lettres correspondants aux nombres ayant une signification.
lst = [51, 52, 66, 91, 92, 82, 65, 53, 86, 42, 79, 95]
Cours⚓︎
Vous pouvez télécharger une copie au format pdf du diaporama de synthèse de cours présenté en classe :
Attention
Ce diaporama ne vous donne que quelques points de repères lors de vos révisions. Il devrait être complété par la relecture attentive de vos propres notes de cours et par une révision approfondie des exercices.