Créer et modifier des listes
Objet mutable
On connaît jusqu'à présent trois types itérables : le type list, le type tuple, et le type str.
| 🐍 Code Python | |
|---|---|
1 2 3 4 | |
Remarque. On observe dans la console :
>>> 1, 2, 3
(1, 2, 3)
Ainsi iter1 et iter2 sont rigoureusement identiques.
iter1 (et iter2) ont pour type tuple, iter3 a pour type list, et iter4 a pour type str.
On peut donc en parcourir les éléments à l'aide d'une boucle for (par indice ou par valeur), et accéder à l'élément d'indice i d'iterable avec la syntaxe iterable[i].
Il est possible de modifier en place la valeur d'un élément dans une liste. Cela se fait à l'aide d'une affectation, comme dans l'exemple ci-dessous.
| 🐍 Code Python | |
|---|---|
1 2 3 4 | |
[10, 11, 15]
Cependant, il n'est pas possible de réaliser cette opération sur des objets de type tuple ou str.
| 🐍 Code Python | |
|---|---|
1 2 3 | |
TypeError Traceback (most recent call last)
Cell In[386], line 3
1 notes = (9, 11, 15)
2 notes[0] # s'évalue en 9
----> 3 notes[0] = 10
4 print(notes)
TypeError: 'tuple' object does not support item assignment
| 🐍 Code Python | |
|---|---|
1 2 3 | |
TypeError Traceback (most recent call last)
Cell In[401], line 3
1 prenom = "drédéric"
2 prenom[0] # s'évalue en "d"
----> 3 prenom[0] = "f"
TypeError: 'str' object does not support item assignment
On dit que les objets de type list sont des objets mutables, tandis que les objets de type tuple et str sont des objets non mutables.
Modification en place d'une liste
Notes arrondies
Un professeur de NSI enseignant au lycée Fustel utilise un programme python pour gérer les notes de ses élèves. Il dispose d'une liste notes de flottants :
| 🐍 Code Python | |
|---|---|
1 | |
À la fin d'un cours, inquiet de ce qu'il voit sur pronote, un élève vient voir le professeur et lui dit qu'il n'a pas obtenu 6.4 au contrôle de NSI mais bien 16.4 !
Écrire l'instruction python qui permet de modifier la variable notes afin de corriger le problème.
Dans sa grande magnanimité, ce professeur de NSI décide d'arrondir les notes au demi-point supérieur. Ainsi, la note de 16.5 sera arrondie à 17, mais la note de 15.4 sera arrondie à 15.5.
Écrire une fonction python arrondir_notes qui prend en argument une liste de notes et qui modifie en place les notes de la liste en les arrondissant au demi-point supérieur.
Indication. Si a est un flottant, alors a%1 représente la partie fractionnaire de a, et a//1 est sa partie entière. Par exemple :
>>> a = 14.25
>>> a % 1
0.25
>>> a // 1
14.0
| 🐍 Code Python | |
|---|---|
1 2 3 4 | |
-
notesest la liste[10, 11, 12].-
Comment est modifié la liste
notesaprès l'exécution dearrondir_notes(notes)? Ce comportement est-il souhaitable ? -
Modifier la fonction
arrondir_notesafin de corriger ce problème.
-
-
notesest le tuple(10, 11, 12).Que se passe-t-il lorsque l'on exécute l'instruction
arrondir_notes(notes)? À quoi ce problème est-il dû ?
Appliquer une réduction aux éléments d'un panier
Au supermarché Dôvv, la gérante est très satisfaite par le programme permettant de calculer le prix à payer par le client. Elle souhaiterait voir implémentée une nouvelle fonctionnalité afin de pouvoir gérer les réductions sur certains articles.
Par exemple on peut avoir :
| 🐍 Code Python | |
|---|---|
1 2 3 | |
:space 1em
Cela signifie que les pommes, initialement à 100 francs l'unité, voient leur prix diminuer de $10\%$. Le prix des ananas est lui diminué de $5\%$, le prix des prunes est diminué de $50\%$.
Écrire une fonction applique_reduction qui prend en argument une liste prix et une liste reduction et qui modifie en place les éléments de la liste prix pour leur appliquer le pourcentage de réduction correspondant. Les nouveaux prix seront arrondis à l'entier inférieur.
Rappel. On rappelle que pour diminuer un prix $p$ de $t\%$ on utilise la formule $p\times \left(1 - \dfrac{t}{100}\right)$.
| 🐍 Code Python | |
|---|---|
1 2 3 4 5 | |
Création de listes en compréhension
Jusqu'à présent on a créé des listes en extension. C'est à dire que l'on a listé de manière exhaustive, "à la main", tous les éléments de la liste les uns après les autres. Par exemple [1, 2, 3].
En python comme en mathématiques, il est possible de créer des listes en compréhension, c'est à dire, non pas de donner les éléments, mais de donner une manière de calculer les éléments de la liste.
-
Entiers inférieurs ou égaux à 5.
⚙️ Résultat>>> [i for i in range(6)] [0, 1, 2, 3, 4, 5] -
Table de multiplication (partielle) de 3.
⚙️ Résultat>>> [3*i for i in range(7)] [0, 3, 6, 9, 12, 15, 18] -
Une liste de 8 zéros.
⚙️ Résultat>>> [0 for i in range(8)] [0, 0, 0, 0, 0, 0, 0, 0] -
La liste des 5 premiers nombres au carré.
⚙️ Résultat>>> [i**2 for i in range(5)] [0, 1, 4, 9, 16]
Dans cet exercice, on a déjà exécuté l’instruction : t = [42, 23, 2, 3, −50].
Donner les listes créées par ces listes en compréhension :
[0 for v in t][v for v in t if v >= 10][i for i in range(len(t)) if (t[i] % 2) == 1][ch[0] for ch in ["Ada", "Alice", "Bob", "Eve"]][i % 10 for i in range(9, 12)][i % 10 for i in range(55) if (i // 50) == 1][i for i in range(len(t)) if t[i] == i]
Copier une liste : phénomène d'aliasing
Considérons les instructions suivantes :
>>> liste1 = [1, 2, 3]
>>> liste2 = liste1
>>> liste1[0] = 10
-
Recopier ces instructions dans la console.
Qu'affiche l'instruction
print(liste2)? Commenter. -
Écrire une fonction
copie_independantequi prend en argument unelisteet qui recopie dans une nouvelle liste tous les éléments delistedans le même ordre avant de la renvoyer.
Correction
| 🐍 Code Python | |
|---|---|
1 2 3 4 | |
| 🐍 Code Python | |
|---|---|
1 2 3 4 | |
Ajouter un élément à une liste
Écrire une fonction ajoute_fin qui prend en argument une liste et un élément e et qui renvoie une copie indépendante de liste dans laquelle l'élément e a été ajouté à la fin.
| 🐍 Code Python | |
|---|---|
1 2 3 4 | |
| 🐍 Code Python | |
|---|---|
1 2 3 4 5 | |
[1, 2, 3, 4]
[1, 2, 3]
[1, 2, 3, 8]
- Justifier les affichages produits par les lignes 2, 3, et 5 du code ci-dessus.
-
Challenge. Écrire une fonction
ajoute_posqui prend en argument une listeliste, un élémenteet un indiceiet qui renvoie la liste constituée des éléments delistedans laquelle on a inséré l'élémenteà l'indicei(les éléments delisted'indice supérieur ou égal àisont donc décalés vers la droite).🐍 Code Python 1 2 3 4 5
def ajoute_pos(liste, e, i): """ [int], int, int -> [int] 0 <= i <= len(liste) Renvoie une liste indépendante de l dans laquelle l'élément e a été inséré à l'indice i """ pass
Supprimer un élément d'une liste
Écrire une fonction supprime_pos qui prend en argument une liste et un indice i compatible avec la taille de la liste et qui renvoie une liste indépendante constituée des éléments de liste dans laquelle l'élément d'indice i de liste n'apparaît pas.
| 🐍 Code Python | |
|---|---|
1 2 3 4 5 | |
| 🐍 Code Python | |
|---|---|
1 2 3 4 | |
[2, 3]
[1, 3]
[1, 2]
Renverser une liste
Écrire une fonction renverse qui prend en argument une liste et qui renvoie une liste dont les éléments sont ceux de liste lus de droite à gauche.
| 🐍 Code Python | |
|---|---|
1 2 3 4 | |
Indication. La documentation officielle indique via help(range) :
class range(object)
range(stop) -> range object
range(start, stop[, step]) -> range object
Return an object that produces a sequence of integers from start
(inclusive) : to stop (exclusive) by step. range(i, j) produces
i, i+1, i+2, ..., j-1. start defaults to 0, and stop is omitted!
range(4) produces 0, 1, 2, 3. These are exactly the valid indices
for a list of 4 elements. When step is given, it specifies
the increment (or decrement).
| 🐍 Code Python | |
|---|---|
1 2 3 | |
[3, 2, 1]
[1, 2, 3]
Liste des indices des occurrences d'un élément dans un tableau
Dans cette partie, on souhaite écrire une fonction indices_occurrences qui renvoie la liste des indices des occurrences de e dans la liste. Si e n'est pas présent dans liste alors la fonction renvoie la liste vide [].
- Rappeler le code de la fonction
nombre_occurrencesqui prend en argument unelisteet un élémenteet qui renvoie le nombre de fois que l'élémenteapparaît dans laliste(son nombre d'occurrences). -
listeest la liste[1, 1, 3, 1, 3, 2]. Que doit renvoyer :indices_occurrences(liste, 1)indices_occurrences(liste, 2)indices_occurrences(liste, 3)indices_occurrences(liste, 4)
On propose trois implémentations différentes pour la fonction indices_occurrences.
Compléter les codes correspondant à la description de l'énoncé. Tester chacune des fonctions.
Implémentation 1.
Pour déterminer la liste des occurrences de e dans liste, on initialise une liste l de bonne taille (elle contiendra les indices de chaque occurrence de e), et un entier i qui servira à mémoriser où on doit stocker dans l l'indice de la prochaine occurrence de e. On parcourt liste par indice : si l'élément d'indice k de liste est une occurrence de e, alors on stocke k à l'indice i de l et on incrémente i.

| 🐍 Code Python | |
|---|---|
1 2 3 4 5 6 7 8 9 | |
Implémentation 2.
On fait appel à la fonction ajoute_fin pour ajouter successivement les indices des occurrences de e à la liste l, sans chercher à connaître au préalable le nombre d'occurrences de e.

| 🐍 Code Python | |
|---|---|
1 2 3 4 5 6 | |
Implémentation 3.
On détermine directement les indices des occurrences de e dans l à l'aide d'une liste en compréhension et d'un filtrage.

| 🐍 Code Python | |
|---|---|
1 2 | |