Cette page est en partie une copie de la page créée par Mireille Coilhac et Frédéric Juniers.
I. Accès par index aux éléments d'une liste, d'un tuple ou d'une chaîne de caractères⚓︎
Types indexables list, tuple et str
En Python, les listes (list), les tuples (tuple) et les chaînes de caractères (str) permettent d'accéder à leurs éléments par index à l'aide de crochets [].
Un accès hors de la plage d'index provoque une erreur IndexError.
Python
notes=[14,16,12]print(notes[3])# Erreur : IndexError: list index out of range
On peut définir des listes imbriquées pour représenter une image en niveaux de gris comme une liste de listes (matrice) par exemple.
Python
image=[[0,255,0],[255,128,255],[0,255,0]]print(image[1][2])# Affiche 255 : élément ligne 1, colonne 2
Les valeurs de type list peuvent être modifiées, on dit qu'elles sont mutables. En revanche les valeurs de type tuple ou str ne peuvent être modifiées, une fois qu'elles sont définies. On dit qu'elles sont immuables.
Type
Mutable ?
Peut-on modifier un élément ?
list
Oui
✅ Oui
tuple
Non
❌ Non
str
Non
❌ Non
Python
# Liste : on peut modifier un élémentnotes=[14,16,12]notes[0]=15print(notes)# [15, 16, 12]# Tuple : modification interditecoord=(3,5)coord[0]=4# TypeError# Chaîne : modification interditetexte="Python"texte[0]="J"# TypeError
Exercice 1 : QCM
Questions
Accès par index dans une liste
On a une liste image telle que image = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]. Quelle est la
valeur de image[2][1] ?
1
6
7
8
On a une liste image telle que image = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]. Quel est le type de image[0] et celui de image[0][2] ?
int pour les deux
list pour les deux
list pour image[0][2] et int pour image[0]
list pour image[0] et int pour image[0][2]
On dispose d’une image représentée par image = [[10, 20], [30, 40]]. Quelle instruction
modifie le pixel situé à la première ligne et à la deuxième colonne pour lui donner la valeur 99 ?
image[0][2] = 99
image[1][2] = 99
image[1][1] = 99
image[0][1] = 99
On considère la liste t = [5, 0, 1, 3, 4, 6]. Quelle est la valeur de t[t[1]] ?
0
4
5
6
On définit L = [4,25,10,9,7,13]. Quelle est la valeur de L[2] ?
4
25
10
9
II. Parcours de listes et de chaînes de caractères⚓︎
Ce paragraphe a principalement été rédigé par Romain Janvier
Rappels sur les parcours de listes et de textes
En Python, il y a principalement 2 méthodes pour parcourir les listes Python (et donc les tableaux) et les textes.
defparcours_par_valeur(donnees):forvalindonnees:print(val)# Quelque chose avec val
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Lors d'un parcours par valeur, on n'a pas accès à l'indice mais uniquement à la valeur. Pour choisir entre les deux, il faut donc se poser la question suivante : Est-ce que j'ai besoin de connaître l'indice de la valeur que je regarde ?
Si la réponse est oui, il faut faire un parcours par indice.
Si la réponse est non, vous pouvez utiliser un parcours par valeur. Mais un parcours par indice fonctionnerait aussi.
Exercice 1 : compter(symbole,texte)
Compléter le code de la fonction compter qui prend en paramètre un texte d'un seul caractère symbole ainsi qu'un texte texte et qui renvoie le nombre de fois où symbole apparaît dans texte.
Compléter le code de la fonction position qui prend en paramètre un entier val ainsi qu'une liste d'entiers nombres et renvoie l'indice de la première occurrence de val dans nombres s'il y en a une et None sinon.
Dans cet exercice nous avons un return dans la boucle. il y a donc sortie anticipée de la boucle s'il n'est pas nécessaire de la terminer.
Ce procédé est souvent utilisé et permet de gagner en efficacité.
Parcours en sens inverse
Il est parfois utile de parcourir une liste Python, ou un texte, en partant du dernier élément et en allant vers le premier. On rappelle que l'indice du dernier élément est n-1, où n est la longueur de la liste ou du texte.
On peut parcourir les indices dans l'ordre inverse en utilisant les paramètres supplémentaires de range. Pour rappel, range(de,vers,pas) part de de et va de pas en pas jusqu'à vers, en s'arrêtant juste avant de l'atteindre. En mettant -1 pour le pas, on parcourt les nombres dans l'ordre inverse.
defparcours_inverse1(donnees):foriinrange(len(donnees)-1,-1,-1):# on part du dernier indice print(i,donnees[i])
Si on ne veut pas utiliser les paramètres supplémentaires de range, il faut calculer l'indice de l'élément regardé à chaque tour de boucle. Si on note i la variable de boucle, n la longueur de la liste ou du texte, alors à chaque tour de boucle, il faut regarder l'élément d'indice n-1-i.
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Vous pouvez utiliser ces parcours, ou pas, pour l'exercice suivant.
Exercice 3 : derniere_position(val,nombres)
Compléter le code de la fonction derniere_position qui prend en paramètre un entier val ainsi qu'une liste d'entiers nombres et renvoie l'indice de la dernière occurrence de val dans nombres s'il y en a une et None sinon.
Compléter le code de la fonction indice_egal_valeurs qui prend en paramètre une liste d'entiers nombres et renvoie True s'il existe un indice i tel que nombres[i]==i et False sinon.
Compléter le code de la fonction moyenne qui prend en paramètre une liste non vide de nombres valeurs et renvoie la moyenne de ces nombres. On n'utilisera pas la fonction len.
Comparaison de nombres réels
On rappelle que la représentation des nombres réels en Python est basée sur le principe de la virgule flottante et qu'à cause de cela, deux expressions mathématiquement égales ne donnent pas forcément le même résultat en Python.
Pour vérifier le résultat de la fonction moyenne avec le résultat attendu, nous utiiserons la fonction indiscernables qui prend deux nombres et renvoie un booléen indiquant si la distance entre ces deux nombres (mathématiquement la valeur absolue de leur différence) est inférieure à \(10^{-15}\).
>>> 0.1*3==0.3# Erreur de virgule flottante classiqueFalse>>> indiscernables(0.1*3,0.3)True
Compléter le code de la fonction moyenne_ponderee qui prend en paramètre une liste non vide valeurs de couples de nombres (note,coeff) et renvoie la moyenne pondérée correspondant à ces notes. On suppose que tous les coefficients sont positifs et qu'il y a au moins un coefficient non nul.
Calcul d'une moyenne pondérée
Pour calculer une moyenne pondérée, il faut aditionner le produit de chacune des notes avec le coefficient correspondant et diviser par la somme des coefficients.
Par exemple, avec 5 notes \(n_1\), \(n_2\), ..., \(n_5\) et les coefficients correspondants \(c_1\), \(c_2\), ..., \(c_5\), la moyenne pondérée est :
Compléter le code de la fonction effectifs qui prend en paramètre une liste donnees contenant des entiers ou des textes et qui renvoie un dictionnaire qui associe à chaque valeur apparaissant dans donnees le nombre de fois où elle y apparaît (c'est à dire le nombre d'occurences de valeur dans donnees).
Par exemple dans la liste [4,1,2,4,2,2,6] il y a une fois la valeur 1, trois fois la valeur 2, deux fois la valeur 4 et une fois la valeur 6. Le résultat attendu pour cette liste sera donc le dictionnaire {1:1,2:3,4:2,6:1}.
On rappelle aussi que dans un dictionnaire, l'ordre dans lequel on donne les valeurs n'a pas d'importance. Ainsi, les dictionnaires {1:1,2:3,4:2,6:1} et
{4:2,1:1,6:1,2:3} sont égaux.
Vous devez générer une liste contenant les entiers de 1 à 49 dans l'ordre croissant. Ensuite, votre code doit tirer, sans remise, 6 numéros qu'on stocke dans une liste, puis, toujours sans remise, un dernier numéro (le numéro complémentaire).
Exemple
Votre code affichera la liste des 6 numéros puis le complémentaire comme ceci :
[31, 3, 12, 45, 13, 27]18
Attention
Vous pourrez importer le module random.
Vous ne devez pas utiliser la fonction choice du module random.
A vous de jouer
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Astuce
🌵 Envisagez différentes façons de coder ce problème, utilisant pop, del ou remove ...
Les objets de type list en Python sont des tableaux dynamiques, qui peuvent être modifiés en place en leur appliquant une méthode appropriée avec la syntaxe objet.methode(arguments).
Méthode
Action
Syntaxe
Type de la valeur renvoyée
append
Ajout d'un élément elt à la liste lis
lis.apppend(elt)
None
pop
Extraire le dernier élément de la liste lis
lis.pop()
celui de l'élément extrait
pop
Extraire l'élément d'indice i' de la liste lis
lis.pop(i)
celui de l'élément extrait
insert
Insertion d'un élément elt à l'élément d'indice i' dans la liste lis
lis.insert(i,elt)
None
extend
Etendre la liste lis1 avec la liste lis2 passée en argument
lis1.extend(lis2)
None
remove
Supprimer la première occurrence de elt dans la liste lis
Écrire une fonction sans_doublon qui prend en paramètre une liste de nombres pouvant contenir des nombres répétés plusieurs fois et renvoie la liste ne contenant qu'une fois chaque nombre.
Trouvez le nombre mystère qui répond aux conditions suivantes :
Il est composé de 3 chiffres.
Il est strictement inférieur à 300.
Il est pair.
Deux de ses chiffres sont identiques.
La somme de ses chiffres est égale à 7.
On vous propose d'employer une méthode dite de « force brute », c'est-à-dire de tester tous les nombres possibles répondants aux trois premières conditions.
Question
Compléter le script suivant
possibles est la liste des nombres répondant aux trois premiers critères.
liste est la liste des nombres répondant au problème.
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Le but de l'activité est d'écrire un programme permettant de résoudre le problème de Joséphus en révisant les listes de Python.
On représente un cercle de n soldats par la liste [1,2,...,n]
Ecrire une fonction soldats(n) qui renvoie la liste [1,2,....,n]
Verifier que n est bien un entier strictement positif à l'aide d'instruction assert
Ajouter une chaîne documentation.
Afin de repérer l'épée, on décide que le soldat qui la tient se situe toujours en première position de la liste.
Compléter l'évolution de la liste de soldat ci-dessous
Etat de la liste
Explications
[1,2,3,4,5,6]
1 élimine 2 et passe l'épée à 3 qui passe donc en tête de liste
[3,...,5,6,1]
3 élimine ... et passe l'épée à ... qui passe donc en tête de liste
[...,6,1,3]
... élimine ... et passe l'épée à ... qui passe donc en tête de liste
[...,...,...]
.....
[...,...]
.....
[...]
.....
Compléter l'algorithme suivant d'évolution de la liste et indiquer les instructions Python correspondantes (on désigne par cercle la liste représentant le cercle de soldats):
Etapes
Opération sur la liste
Instructions Python
..........
tueur=cercle.pop(0)
Ajouter cet élément en fin de liste
......
Supprimer le premier élément
......
Quel est la condition d'arrêt de l'algorithme ?
Exprimer cette condition par un test en python sur cercle
Programmer une fonction josephus(n) qui renvoie le soldat survivant pour un cercle de n soldats.
Un dictionnaire en Python est une structure de données qui permet d'associer des clés à des valeurs. Contrairement aux listes, les éléments d'un dictionnaire ne sont pas ordonnés et sont accessibles par leur clé et non via leur position dans le dictionnaire.
En Python, un dictionnaire est de type dict, il est délimité par des accolades et les associations entre clef et valeur sont notées clef: valeur et les différentes associations sont séparées par une virgule.
Plusieurs méthodes sont possibles pour créer un dictionnaire de type dict :
Python
# Création par extensiondico={"nom":"Alice","âge":25,"ville":"Paris"}# Création avec le constructeur dictdico2=dict(nom="Bob",âge=30,ville="Lyon")# Création par compréhensioncarres={x:x**2forxinrange(1,6)}# création d'un dictionnaire videdico_vide1={}# avec délimiteursdico_vide2=dict()# avec constructeur
Lecture/modification dans un dictionnaire
Les dictionnaires sont des objets mutables en Python, ils sont accessibles en lecture ou écriture comme les objets de type list. Pour rappel les objets de type tuple sont juste accessibles en lecture.
Python
# Accéder à une valeurprint(dico["nom"])# Affiche "Alice"# Modifier ou ajouter une valeurdico["âge"]=26# Modificationdico["pays"]="France"# Ajout# Supprimer une entréedeldico["ville"]
Différences entre liste et dictionnaire
Les méthodes append et insert n'existent pas pour un dictionnaire car il n'y a pas de notion d'ordre d'insertion. En revanche la méthode pop existe.
La fonction sorted ne trie que les clefs et la méthode sort n'est pas définie. Enfin, les fonctions min et max n'opèrent de même que sur les clefs.
Type
Opération
Syntaxe
list
ajout d'un élément à la fin
lis.append(element)
dict
ajout d'une association clef: valeur
dico[clef] = valeur
list
extraire l'élément d'index k
lis.pop(k)
dict
extrait la valeur associée à la clef
dico.pop(clef)
Un petit exemple avec le nombre de titres de champions de France de Football en 2024:
Python
>>>titres={'PSG':12,'ASSE':10,'OM':10,'ASM':8,'OL':7}>>>titres['OM']=titres['OM']-1# Affaire OM/VA le titre de 1993 est retiré pour tricherie>>>titres['FCNA']=8# on avait oublié le FC Nantes !>>>titres.pop('PSG')# exclu pour concurrence déloyale12>>>titres{'ASSE':10,'OM':9,'FCNA':8,'ASM':8,'OL':7}>>>sorted(titres)# on ne trie que les clefs['ASM','ASSE','FCNA','OL','OM']
Valeurs mutables ou immuables
Type
Propriété
Sens
list, dict
mutable
acessible en lecture et écriture
tuple, int, bool, str
immuable
accessible en lecture seule / non modifiable
Attention, dans les associations clef: valeur d'un dictionnaire, la clef ne peut être que d'un type immuable c'est-à-dire non modifiable en écriture : tuple, int, bool, str. Il n'y a pas de restriction sur le type de la valeur.
Python
# un dictionnaire dont les valeurs sont des listescarnet_notes={'Alex':[14,11,13],'Sabri':[18,15,14]}# valeur d'une position (ligne, colonne) dans un jeu de plateau# on peut utiliser des tuples comme clefs car ils sont immuablesvaleur={(1,2):10,(4,5):-1}# on ne pourrait pas utiliser [1, 2] et [4, 5] comme clefs
Parcours de dictionnaires
Trois méthodes de parcours d'une dictionnaire sont possibles. Le parcours par index n'est pas possible car il n'y a pas d'index dans un dictionnaire mais des clefs.
Python
# Parcours par les clésforcleindico.keys():print(cle)# Syntaxe simplifiée pour le parcours par les clésforcleindico:print(cle)# Parcours par les valeursforvaleurindico.values():print(valeur)# Parcours par paires clé-valeurforcle,valeurindico.items():print(f"{cle}: {valeur}")
Exercice 11 : QCM
Questions
QCM sur les dictionnaires en Python. Une question peut avoir plusieurs bonnes propositions de réponse.
Compétences évaluées :
📝 Accéder aux éléments d’un dictionnaire
📝 Ajouter, modifier et supprimer des éléments
📝 Parcourir un dictionnaire avec une boucle
📝 Vérifier la présence d’une clé
📝 Travailler avec une liste de dictionnaires
📝 Utiliser get() pour éviter des erreurs
📝 Inverser un dictionnaire
On dispose d'un dictionnaire stockant les prix de plusieurs articles en euros :
Compléter le script suivant pour qu'il affiche la liste pokemons_rapides des noms des pokémons dont la vitesse est supérieure à 60.
On doit obtenir l'affichage : ['Salameche', 'Reptencil'] ou ['Reptencil', 'Salameche']
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)