Python : Listes
Méthodes de listes
Quelques méthodes de listes que je n'utilise pas souvent.
Je partirais ici d'une liste nommée L tel que L = ["a", "b", "c", "d"]
- Supprimer un élément : L.remove("a")
- Les index négatifs partent de la fin : print(L[-1]) >>> d
- Découpage :
- Du début : print(L[:2]) >>> ['a', 'b']
- De la fin : print(L[2:]) >>> ['c', 'd']
- Entre 2 : print(L[1:3]) >>> ['b', 'c']
- L[n:p] renvoie les éléments de n inclut à p-1
- Attention, Ce genre de découpage renvoie vers une copie de la liste et pas vers l'original ! Même si ça marche étrangement avec del : del (L[0:2]) fonctionne par exemple
- La méthode index : L.index("b") >>> 1
- Si l'élement recherché est plusieurs fois dans la liste, c'est la première occurence qui est renvoyée
- Supprimer l'objet situé à un index : L.pop(2) supprime "c"
- Utilisé seul, pop supprime le dernier élément d'une liste :
a = L.pop()
>>> L ['a', 'b', 'c'] >>> a 'd'
- Insérer un truc à un index : L.insert(2, "oui") >>> ['a', 'b', 'oui', 'c', 'd']
- La syntaxe : L.insert(index, objet)
- Insérer une liste à la fin d'une autre : extend fonctionne comme append mais avec une liste : L.extend(["e", "f"]) >>> ['a', 'b', 'c', 'd', 'e', 'f']
- Trier une liste : sort
>>> M = ["d", "b", "c", "a"]
>>> M.sort() >>> M
['a', 'b', 'c', 'd']
- Trouver le min ou le max d'une liste : min(L) ou max(L)
- Inverser une liste :
>>> L.reverse()
>>> L
['d', 'c', 'b', 'a']
enumerate : accéder aux index facilement
Une méthode simple pour énumérer le contenu d'une liste est d'utiliser la fonction enumerate (plutôt que de faire des compteurs...):
>>> li = ['a', 'b', 'c'] >>> for index, letter in enumerate(li): ... print(index, letter) ... 0 a 1 b 2 c
Comme on peut le voir, cela nous permet d'accéder aux index en même temps qu'aux contenus.
zip : boucler sur plusieurs listes
Pour faire des boucles sur plusieurs listes, le plus simple est la fonction zip :
>>> animaux = ["chien", "chat", "poisson"] >>> cris = ["ouaf", "miaou", "bloups"] >>> for animal, cri in zip(animaux, cris): ... print(f'{animal}{cri}') ... chienouaf chatmiaou poissonbloups
Bon à savoir
La méthode for appliquée sur une liste est un peu spéciale. En effet, l'itérateur ne parcoure pas forcément la liste en entier mais il utilise un compteur invisible qui s'incrémente de 1 à chaque fois. Du coup, en modifiant la liste pendant qu'on la parcoure, on peut avoir des surprises : si on enlève des éléments notamment, comme la liste change en cours de route, cela peut poser problème.
def supprimeVoyelle (L,V) : # fonction censée supprimée les chaines de la liste L contenant la voyelle V for i in L : if V in i : L.remove(i) # programme principal LSimpson = ["Homer", "Marge", "Bart", "Lisa", "Moe", "Charles", "Nelson", "Milhouse", "Krusty", "Barney"] supprimeVoyelle (LSimpson,"a") print(LSimpson) #Bart n'as pas disparu : ke compteur invisible a supprimé Marge, du coup Bart l'as remplacée sans être analysé
Par rapport aux suppressions :
def videListe(L) : L=[] L = [1, 2, 3] print(L) videListe(L) print(L)
Ça ne fonctionne pas parce que L = [] ne vide pas la liste, il crée un nouvel objet interne à la fonction (même si L est passée par référence... va comprendre). Il faut utiliser del L([:]).
Aussi, on peut créer une liste avec un objet range.
L = list(range(5, 18, 2))
Méthodes de création de listes
Compréhension de listes
https://realpython.com/list-comprehension-python/#using-list-comprehensions
Simples
Les compréhensions de listes (je ne suis pas sûre de la traduction du terme list comprehension) sont un moyen de générer des listes en une seule ligne de code. La syntaxe de base est:
<source lang="python"> liste = [expression for valeur in collection]
- Par exemple
>>> squares = [i**2 for i in range(1, 101)] >>> squares [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401, 2500, 2601, 2704, 2809, 2916, 3025, 3136, 3249, 3364, 3481, 3600, 3721, 3844, 3969, 4096, 4225, 4356, 4489, 4624, 4761, 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241, 6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921, 8100, 8281, 8464, 8649, 8836, 9025, 9216, 9409, 9604, 9801, 10000] </source>
Ici, on part de "collection", qui est un ensemble de trucs (il nous faut bien des valeurs à mettre dans notre liste !). On prend chacun de ces trucs (que l'on appelle valeur) et on l'ajoute à notre liste en lui faisant subir "expression". L'expression peut être une simple initialisation:
<source lang="python"> >>> nombres = [entier for entier in range(1, 10)]
>>> nombres [1, 2, 3, 4, 5, 6, 7, 8, 9] </source>
Supercharged !
On peut rajouter bien des choses dans nos compréhensions de listes. En effet, la syntaxe complète est:
<source lang="python"> liste = [expression for valeur in collection if condition]
- Exemple
>>> pairs = [i for i in nombres if i % 2 == 0] >>> pairs [2, 4, 6, 8] </source>
Là, on a juste utilisé une condition : si elle est vraie, on stocke. Mais on peut aussi avoir le cas : si la condition est vraie, stocke i; sinon, stocke un autre truc.
<source lang="python">
- Autre façon de faire:
liste = [expression (if condition else autre_valeur) for valeur in collection] >>> pairs = [i if i % 2 == 0 else 0 for i in nombres] >>> pairs [0, 2, 0, 4, 0, 6, 0, 8, 0] </source>
Compréhension de sets
Pour rappel, un set est une liste qui ne contient pas de valeurs en double (tous ses éléments sont uniques). On peut les créer avec des compréhensions:
<source lang="python"> >>> quote = "Le gras, c'est la vie" >>> voyelles_uniques = {i for i in quote if i in "aeiouy"} >>> voyelles_uniques {'e', 'a', 'i'} </source>
Utiliser l'opérateur morse
Python 3.85 introduit l'opérateur "morse" := , qui permet de faire tourner une expression tout en assignant sa sortie à une variable. On peut s'en servir dans une compréhension de liste:
<source lang="python"> >>> import random >>> def genere_random(): ... return random.randrange(90, 110) >>> randoms = [rand for _ in range(20) if (rand := genere_random()) >= 100] >>> randoms [108, 103, 101, 108, 105, 105, 109, 105, 101, 107, 100] </source>