Listes Python

Python dispose d'un excellent type de liste intégré nommé "list". Les littéraux de liste sont écrits entre crochets [ ]. Les listes fonctionnent de la même manière que les chaînes : utilisez la fonction len() et des crochets [ ] pour accéder aux données, le premier élément ayant l'index 0. Consultez la documentation officielle de la liste python.org.

  colors = ['red', 'blue', 'green']
  print(colors[0])    ## red
  print(colors[2])    ## green
  print(len(colors))  ## 3

liste de chaînes "red" "blue" "green"

L'affectation avec un signe = sur des listes ne crée pas de copie. Au lieu de cela, l'affectation fait pointer les deux variables vers la même liste en mémoire.

  b = colors   ## Does not copy the list

Les couleurs et b pointent vers la même liste

La "liste vide" n'est qu'une paire de crochets vides [ ]. Le signe + permet d'ajouter deux listes. Ainsi, [1, 2] + [3, 4] donne [1, 2, 3, 4] (comme avec les chaînes).

FOR et IN

Les constructions *for* et *in* de Python sont extrêmement utiles. Nous allons les utiliser pour la première fois avec des listes. La construction *pour* -- for var in list -- permet d'examiner facilement chaque élément d'une liste (ou d'une autre collection). N'ajoutez ni ne supprimez rien de la liste pendant l'itération.

  squares = [1, 4, 9, 16]
  sum = 0
  for num in squares:
    sum += num
  print(sum)  ## 30

Si vous savez quel type d'éléments figure dans la liste, utilisez un nom de variable dans la boucle qui capture ces informations, comme "num", "name" ou "url". Comme le code Python ne dispose d'aucune autre syntaxe pour vous rappeler les types, les noms de vos variables sont un moyen essentiel de vous assurer que vous comprenez ce qui se passe. (cette information est un peu trompeuse). À mesure que vous vous familiariserez avec Python, vous verrez des références à des suggestions de type qui vous permettent d'ajouter des informations de saisie à vos définitions de fonction. Python n'utilise pas ces suggestions de types lorsqu'il exécute vos programmes. Ils sont utilisés par d'autres programmes tels que les IDE (environnements de développement intégrés) et les outils d'analyse statique tels que les linters/outils de vérification de type pour valider si vos fonctions sont appelées avec des arguments compatibles.)

La construction *in* en elle-même est un moyen simple de vérifier si un élément apparaît dans une liste (ou une autre collection) (value in collection). Elle vérifie si la valeur se trouve dans la collection et renvoie la valeur "True/False".

  list = ['larry', 'curly', 'moe']
  if 'curly' in list:
    print('yay') ## yay

Les constructions for/in sont très couramment utilisées dans le code Python et fonctionnent sur des types de données autres que des listes. Il vous suffit donc de mémoriser leur syntaxe. Vous avez peut-être pris l'habitude d'itérer manuellement sur une collection dans d'autres langages, alors qu'en Python, vous devez simplement utiliser for/in.

Vous pouvez également utiliser for/in pour travailler sur une chaîne. La chaîne agit comme une liste de ses caractères. for ch in s: print(ch) affiche donc tous les caractères d'une chaîne.

Plage

La fonction range(n) renvoie les nombres 0, 1, ... n-1, et range(a, b) renvoie a, a+1, ... b-1, jusqu'au dernier nombre, mais sans l'inclure. La combinaison de la boucle for et de la fonction range() vous permet de créer une boucle for numérique classique :

  ## print the numbers from 0 through 99
  for i in range(100):
    print(i)

Il existe une variante xrange() qui évite le coût de la création de la liste entière pour les cas sensibles aux performances (en Python 3, range() présente un bon comportement en termes de performances et vous pouvez oublier xrange()).

Boucle "while"

Python dispose également de la boucle while standard, et les instructions *break* et *continue* fonctionnent comme en C++ et en Java, en modifiant le cours de la boucle la plus interne. Les boucles for/in ci-dessus résolvent le cas courant d'itération sur chaque élément d'une liste, mais la boucle while vous permet de contrôler totalement les numéros d'index. Voici une boucle while qui accède à chaque troisième élément d'une liste :

  ## Access every 3rd element in a list
  i = 0
  while i < len(a):
    print(a[i])
    i = i + 3

Méthodes de liste

Voici d'autres méthodes courantes de création de listes.

  • list.append(elem) : ajoute un seul élément à la fin de la liste. Erreur courante : la nouvelle liste n'est pas renvoyée, mais simplement modifiée.
  • list.insert(index, elem) : insère l'élément à l'index donné, en décalant les éléments vers la droite.
  • list.extend(list2) ajoute les éléments de list2 à la fin de la liste. L'utilisation de + ou += sur une liste est similaire à l'utilisation d'Extend().
  • list.index(elem) : recherche l'élément donné à partir du début de la liste et renvoie son indice. Génère une valeur ValueError si l'élément n'apparaît pas (utilisez "in" pour vérifier sans valeur ValueError).
  • list.remove(elem) : recherche la première instance de l'élément donné et la supprime (une erreur ValueError est générée s'il n'est pas présent).
  • list.sort() : trie la liste à sa place (ne la renvoie pas). (Nous vous recommandons d'utiliser la fonction sorted() présentée plus loin.)
  • list.reverse() : inverse la liste sur place (ne la renvoie pas)
  • list.pop(index) : supprime et renvoie l'élément à l'index donné. Renvoie l'élément le plus à droite si l'index est omis (à peu près l'opposé de "append()").

Notez qu'il s'agit de *méthodes* sur un objet liste, tandis que len() est une fonction qui utilise la liste (ou la chaîne, ou autre) comme argument.

  list = ['larry', 'curly', 'moe']
  list.append('shemp')         ## append elem at end
  list.insert(0, 'xxx')        ## insert elem at index 0
  list.extend(['yyy', 'zzz'])  ## add list of elems at end
  print(list)  ## ['xxx', 'larry', 'curly', 'moe', 'shemp', 'yyy', 'zzz']
  print(list.index('curly'))    ## 2

  list.remove('curly')         ## search and remove that element
  list.pop(1)                  ## removes and returns 'larry'
  print(list)  ## ['xxx', 'moe', 'shemp', 'yyy', 'zzz']

Erreur courante: notez que les méthodes ci-dessus ne *renvoient* pas la liste modifiée. Elles modifient simplement la liste d'origine.

  list = [1, 2, 3]
  print(list.append(4))   ## NO, does not work, append() returns None
  ## Correct pattern:
  list.append(4)
  print(list)  ## [1, 2, 3, 4]

List Build Up

Un modèle courant consiste à commencer une liste par la liste vide [], puis à utiliser append() ou extend() pour y ajouter des éléments :

  list = []          ## Start as the empty list
  list.append('a')   ## Use append() to add elements
  list.append('b')

Répertorier les segments d'application

Les tranches fonctionnent sur les listes comme sur les chaînes et peuvent également être utilisées pour modifier des sous-parties de la liste.

  list = ['a', 'b', 'c', 'd']
  print(list[1:-1])   ## ['b', 'c']
  list[0:2] = 'z'    ## replace ['a', 'b'] with ['z']
  print(list)         ## ['z', 'c', 'd']

Exercice : list1.py

Pour vous entraîner avec le contenu de cette section, essayez les problèmes de list1.py qui n'utilisent pas de tri (dans les exercices de base).