Python : Listes

De Justine's wiki
Aller à la navigation Aller à la recherche

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]

  1. 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]

  1. 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">

  1. 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>