TP 2
STRUCTURES DE DONNÉES ET ITÉRATION
Les exercices proposés sont (sauf erreur) faisables en n’utilisant que les concepts qui ont déjà été exposés. Cepen-
dant, il est souvent possible d’écrire quelque chose de plus «idiomatique» à l’aide de structures décrites plus loin
dans le TP ou en utilisant des fonctions de la bibliothèque standard. C’est ce qui a été fait dans le corrigé, tout en
essayant de ne pas sombrer dans l’ésotérisme.
1 Listes
1.1 Généralités
La structure de données sans doute la plus utilisée en python est la liste. Les listes python sont en fait des tableaux
dynamiques : on peut accéder à n’importe quel élément du tableau et le modifier en temps constant et on peut au
besoin ajouter des éléments en queue de tableau, dans le cas le pire en temps proportionnel à la taille du tableau et
en temps amorti constant 1.
Pour créer une liste, il sut de donner ses éléments :
>>> l = [ 1, 2, 3, ’ soleil ]
Comme on le voit, python n’impose pas que tous les éléments de la liste soient du même type.
1.2 Accès
On peut alors accéder à un élément par son numéro. Les éléments sont en eet indexés par leur numéro, en
commençant à zéro pour le premier :
>>> l[3]
’ soleil
>>> l[0]
1
Mais on peut aussi compter à partir du dernier :
>>> l[ -1]
’ soleil
>>> l[ -2]
3
>>> l[ -4]
1
Autrement dit, dans le cas où on lui donne un index négatif, python ajoute à celui-ci le nombre d’élément de la
liste avant d’aller chercher l’élément.
1.3 Modification
On peut changer la valeur de l’élément numéro 2 pour qu’elle vaille 7 par la commande l[2]=7
On peut obtenir la longueur d’une liste avec la fonction len.
1. Autrement dit, l’ajout d’un unique élément à un tableau de taille npeut demander un temps constant, mais l’ajout de kéléments à un
tableau de taille ndemande au total au plus un temps proportionnel à n+k.
Lyc´
ee du Parc – Lyc´
ee LaMartini`
ere Monplaisir – Formation Python 1
TP2–Structures de donn´
ees et it´
eration
1.4 Tranchage (slicing)
On peut découper une liste en «tranches» (opération connue sous le nom de «slicing» en anglais) :
Par exemple, pour obtenir les éléments de rangs 2 à 4 de la liste précédente :
>>> l[2:4]
[7, ’ soleil ]
Attention : ne pas oublier qu’en python, les intervalles d’entiers sont fermés à gauche et ouverts à droite. Quand
on demande les éléments de rangs compris entre 2 et 4, on obtient donc les éléments de rangs appartenant à ~2,4~.
On peut également remplacer une tranche d’une liste :
>>> l
[1, 2, 3, ’ soleil ]
>>> l[1:3] = [ ’ Bonjour , H e l l o ,’ Guten Tag ,’ Buongiorno ]
>>> l
[1, ’ Bonjour , H e l l o ,’ Guten Tag ,’ Buongiorno ,’ soleil ]
De manière générale, la syntaxe des tranches est l[start:stop:step] start désigne l’indice où commencer,
stop l’indice avant lequel il faut s’arrêter et step l’incrément à donner à l’indice à chaque étape. On peut omettre
ces valeurs start,stop,step, auquel cas python leur donne respectivement les valeurs 0, len(l) et 1. Ainsi
l[1::2] désigne les éléments de lde rang impair et l[::2] ceux de rang pair.
1.5 Aliasing
De manière générale, un objet python est représentée en machine par une suite d’octets dans la mémoire vive.
Lorsqu’on veut faire référence à un objet on le fait par son adresse en mémoire.
On peut obtenir l’adresse en mémoire d’un objet avec la fonction id
>>> a = [11 , 22, 33]
>>> id(a)
3072380108
(NB : l’adresse en question dépend de beaucoup de facteurs, vous n’obtiendrez pas la même que ci-dessus)
Dire qu’on met un objet dans une variable est un abus de langage : une variable python ne contient pas le moindre
objet mais seulement l’adresse d’un objet (on dit que la variable pointe vers l’objet 2).
Lorsqu’on copie le contenu d’une variable dans une autre, python se contente en fait de copier cette adresse :
>>> b = a
>>> id(b)
3072380108
Cela aura deux conséquences :
1. La copie du contenu d’une variable dans une autre se fait en temps constant (indépendant de la taille de l’objet
vers lequel elle pointe). C’est en particulier le cas lorsqu’on appelle une fonction : mettre un argument réel
de la fonction dans la variable jouant le rôle de paramètre formel se fait en temps constant.
2. Après la copie du contenu d’une variable dans une autre, les deux variables pointent vers le même objet.
Toute modification de l’un sera visible de l’autre, pour le meilleur et pour le pire. On dit que les deux
variables sont alias l’une de l’autre.
>>> a[0] = 44
>>> a
[44, 22, 33]
>>> b
[44, 22, 33]
Exercice 1
Comprendre la diérence entre :
>>> a = [11 , 22, 33]
>>> b = a
>>> a[0:3] = [17 , 42, 561]
et
2. Je suspecte qu’il s’agit d’un anglicisme : to point at/to.
Lyc´
ee du Parc – Lyc´
ee LaMartini`
ere Monplaisir – Formation Python 2
TP2–Structures de donn´
ees et it´
eration
>>> a = [11 , 22, 33]
>>> b = a
>>> a = [17 , 42, 561]
Les questions d’aliasing sont récurrentes en informatique, et loin d’être spécifiques à python.
Exercice 2
Que valent aet baprès l’exécution du code suivant :
>>> a = [11 , 22, 33]
>>> b = [7, 14, a]
>>> b
[7, 14, [11 , 22 , 33]]
>>> b[2][1]=17
>>> a[0] = 19
Exercice 3
Que fait la fonction suivante :
>>> d e f swap (l , i, j ):
... l[i] = l[i] + l[j]
... l[j] = l[i] - l[j]
... l[i] = l[i] - l[j]
Si vous avez répondu qu’elle échangeait le contenu de l[i] et l[j], cherchez encore...
1.6 Concaténation
On peut concaténer deux listes avec +. C’est une opération qui renvoie une nouvelle liste :
>>> a = [2, 4, 6]
>>> b = [8, 10, 12]
>>> c = a
>>> id(a)
3072535692
>>> id(c)
3072535692
>>> a = a + b
>>> id(a)
3072535852
>>> id(c)
3072535692
>>> a
[2, 4, 6, 8, 10, 12]
>>> c
[2, 4, 6]
On peut concaténer une liste à la fin d’une liste existante avec +=. Attention, on modifie ainsi la liste donnée :
>>> a = [2, 4, 6]
>>> b = [8, 10, 12]
>>> c = a
>>> id(a)
3072535468
>>> id(c)
3072535468
>>> a += b
>>> a
[2, 4, 6, 8, 10, 12]
>>> id(a)
3072535468
Lyc´
ee du Parc – Lyc´
ee LaMartini`
ere Monplaisir – Formation Python 3
TP2–Structures de donn´
ees et it´
eration
>>> id(c)
3072535468
>>> a
[2, 4, 6, 8, 10, 12]
>>> c
[2, 4, 6, 8, 10, 12]
>>>
Au lieu de a += b, on peut aussi utiliser a.extend(b).
On peut ajouter un élément à la fin d’une liste en utilisant la méthode append :
>>> a = [2, 4, 6]
>>> a. append (22)
>>> a
[2, 4, 6, 22]
1.7 Insertion
On peut insérer un élément à un index donné avec la méthode index :
>>> a = [2, 4, 6]
>>> a. insert (2 , 18)
>>> a
[2, 4, 18, 6]
Notez que l’index passé est la position qu’aura le nouvel élément. L’ancien élément qui était à cette position, ainsi
que tous les suivants, sont décalés d’un cran vers la droite. La méthode insert peut être remplacée par un coup de
slicing : a[2:2] = [18].
1.8 Suppression
Enfin, on peut enlever un élément avec l’instruction del :
>>> a = [2, 4, 6, 8, 10, 12, 14]
>>> d e l a[3]
>>> a
[2, 4, 6, 10, 12 , 14]
>>> d e l a[2:4]
>>> a
[2, 4, 12, 14]
Une autre façon d’enlever les éléments est la méthode pop, qui de plus retourne l’élément enlevé :
>>> a = [2, 4, 6, 8, 10, 12, 14]
>>> a.pop ()
14
>>> a
[2, 4, 6, 8, 10, 12]
>>> a. pop (3)
8
>>> a
[2, 4, 6, 10, 12]
Enfin la méthode remove enlève le premier élément égal à l’élément donné :
>>> a = [2, 4, 6, 8, 10, 12, 14]
>>> a. remove (12)
>>> a
[2, 4, 6, 8, 10, 14]
1.9 Appartenance
L’opérateur in permet de tester l’appartenance à une liste :
Lyc´
ee du Parc – Lyc´
ee LaMartini`
ere Monplaisir – Formation Python 4
TP2–Structures de donn´
ees et it´
eration
>>> 9 i n [3, 5, 7, 11 , 13]
False
>>> 7 i n [3, 5, 7, 11 , 13]
True
C’est une construction utile, qu’on trouve régulièrement sous la forme
>>> i f vi n premiers:
... print(v , " e s t un nombre p r e m i e r . " )
On dispose aussi de not in, qui s’utilise sous la forme vnot in l.
1.10 Autre
Voir les méthodes reverse,count,sort.
Voir également les fonctions sum,min,max et sorted.
2 Tuples
Les tuples, ou n-uplets, sont très similaires aux listes :
>>> l = (11 , 22, 33)
>>> l[2]
33
>>> len(l)
3
>>> u = l + (44 , 55 , 66)
>>> u
(11, 22 , 33, 44, 55, 66)
La diérence essentielle entre tuples et listes est que la modification d’un tuple est interdite : une fois créé un tuple
ne peut en aucun cas être modifié (on parle d’objets non mutables).
Les opérations disponibles sur les listes sont à peu près toutes disponibles sur les tuples, sauf celles qui les modi-
fient. Une exception dans l’exception cependant : on peut écrire a += b mais c’est équivalent à a=a+bdans le
cas des tuples.
Attention à ne pas confondre :
>>> x = (42) # entier
>>> y = (42 ,) # 1uplet
>>> x
42
>>> y
(42 ,)
>>> len(y)
1
>>> y[0]
42
>>> len(x)
Traceb ack ( mo st r ecent c all last ):
File " < s t d i n > " , line 1, i n <module >
TypeError: object of type i n t has no len ()
Attention également : une fonction prenant en argument un couple n’est pas la même chose qu’une fonction prenant
en argument deux variables.
3 Itérations
3.1 Itération simple sur une liste
En Python, un objet lest dit itérable s’il est capable de renvoyer un par un tous ses éléments. Quand on écrit
for xin l, la variable xprend successivement toutes les valeurs des éléments de l. La manière usuelle d’itérer sur
une tableau dans de nombreux langages fonctionne en python :
Lyc´
ee du Parc – Lyc´
ee LaMartini`
ere Monplaisir – Formation Python 5
1 / 14 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !