
TP-Cours ITC 01
Un type composé de Python : les listes (partie II)
II. Accès et modification
II.1 Les listes : un type d'objets mutables
On accède à un/aux élément(s) d’une liste par son/leurs indice(s). Ainsi, l[i] désigne le i-ème élément (le premier élément a l’indice 0) d’une liste l et l[i:j] désigne la liste formée formée des éléments de l qui sont situés entre l’indice i (inclus) et l’indice j (exclu). On parle alors de coupe ou de slice en anglais et la technique utilisée porte le nom de slicing !
Par ailleurs, l[i:j:k] désigne une coupe dans la liste l entre l’indice i (inclus) et l’indice j (exclu) par pas de k
Rappelons que quand on crée une variable, donc lorsqu’on lie un identificateur à un objet par l’instruction nom=obj , on associe en fait à cet identificateur l’adresse en mémoire où se trouve physiquement l’objet. On exprime cette situation en disant qu’on crée une référence, ou encore un pointeur, vers l’objet.
Il y a une différence importante entre les listes d’une part, et les chaînes et tuples de l’autre : les listes sont dites mutables, mais les chaînes et les tuples ne le sont pas.
Dire qu’un objet est mutable, c’est dire qu’on peut en modifier (voire supprimer/ajouter) un (ou plusieurs) élément(s), sans pour autant créer une nouvelle référence vers l’objet ainsi modifié (l’adresse du début de l’objet reste inchangée).
On peut donc modifier un élément ou plusieurs éléments d’une liste en s’inspirant des différentes manières d’y accéder que nous venons d’expérimenter ci-dessus. Exécutez le code suivant en essayant de bien comprendre les résultats obtenus.
Parcours d’une liste (version 2)
Notons que len(maliste) désigne la longueur de la liste maliste . Il est possible de parcourir les éléments d’une liste en utilisant une boucle for et l’indexation selon la syntaxe suivante :
for i in range(len(maliste)):
instructions utilisant maliste[i]
Ici, la variable i va prendre les valeurs 0 puis 1 puis … puis len(maliste)-1 donc maliste[i] prendra toutes les valeurs de maliste (dans l’ordre). Les exemples suivants illustrent l’utilisation d’une boucle for et de l’indexation pour parcourir une liste :
On considère les listes
t2 = [31,28,31,30,31,30,31,31,30,31,30,31] t1 = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre']
Écrire une fonction qui prend comme paramètre une liste d’entiers l et renvoie deux listes : l’une contenant, dans l’ordre, les entiers pairs de l et l’autre les entiers impairs de l . Par exemple, si l=[11,2,3,15,6,12,13,45,14], votre fonction devra renvoyer les liste [2,6,12,14] et [11,3,15,13,45].
A l’aide du code suivant :
file = open("mots.txt",'r',encoding="utf-8")
listeMots = file.read().split()
file.close()
ouvrir le fichier mots.txt contenant des mots Français.
Attention ! Utilisez Ctrl+Shift+E (Command +Shift+E sur Mac) pour exécuter ce code dans Pyzo afin que celui-ci considère votre répertoire courant comme le répertoire dans lequel chercher le fichier mots.txt ! Un simple Ctrl+E (Command+E) ne fonctionnera pas.
Soit
on dit que
On place l’entier 1 au milieu de la première ligne. On suppose par récurrence que les
- on pose
(sauf si , auquel cas on pose ) et (sauf si , auquel cas on pose ) - si aucun nombre n’a encore été placé à la
-ème ligne et -ème colonne, on y place - si cet emplacement est pris, on pose
(sauf si , auquel cas on pose ) et et on y place en -ème ligne et -ème colonne.
II.2 Méthodes (du programme) spécifiques aux listes
Si maliste est une variable de type list, la commande dir(maliste) fournit les méthodes s’appliquant aux objets de type list. Le tableau suivant présente deux de ces méthodes :
maliste.append(x) maliste.append(x) |
Ajoute un élément x à la fin de la liste maliste . |
maliste.pop(i) maliste.pop(i) |
Supprime l’élément d’indice i de la liste maliste et supprime son dernier élément si aucun indice n’est spécifié. |
Notez bien que ces méthodes modifient la liste maliste « en place », ce qui signifie que l’identifiant de la variable maliste n’est pas modifié : la référence vers l’objet modifié est la même qu’avant modification.
Un polynôme est représenté par la/une liste de ses coefficients. Par exemple, le polynôme
On souhaite maintenant mélanger la liste en utilisant la méthode de coupe. Il s’agit, comme dans un jeu de carte, de couper la liste en deux à un endroit aléatoire. Les deux parties sont ensuite interverties. Écrire une fonction coupe(liste,index) qui coupe la liste au niveau de l’index :
>>> liste = [0, 1, 2, 3, 4, 5] >>> coupe(liste, 2) >>> print(liste) [2, 3, 4, 5, 0, 1]
Le mélange Faro consiste à couper un jeu de cartes en deux et interpénétrer ces deux parties pour reconstituer le jeu. Un mélange parfait (deux moitiés égales, la fusion des deux moitiés se faisant carte par carte) est impressionnant, mais n’est pas un bon mélange.
Le Faro out se pratique comme suit :
On coupe le jeu en deux moitiés égales, puis on reconstitue le jeu avec la 1ère carte de la 1ère moitié, la 1ère carte de la 2ème moitié, la 2ème carte de la 1ère moitié, la 2ème carte de la 2ème moitié, …, la dernière carte de la 1ère moitié, la dernière carte de la 2ème moitié.
La première et la dernière carte restent donc en place.
Le Faro in est semblable, sauf que l’on commence par la 2ème moitié, la première et la dernière carte changent donc de place.
On se propose de programmer le mélange Faro de deux listes :
