Python: les listes

Cet article est archivé dans la rubrique Le langage Python.

Une liste est un ensemble d’éléments séparés par des virgules et entourés de crochets. Ces éléments peuvent être de n’importe quel type: str(), int(), float(). Il existe même des listes de listes! Contrairement aux chaînes de caractères, il est possible de modifier une liste grâce au slicing et à différentes méthodes que je vais vous présenter dans ce chapitre.

pythontutor

Déclarer une liste

Pour déclarer une liste vide, il existe deux syntaxes différentes:

liste_1 = []
liste_2 = list()
print(liste_1, liste_2)

Résultat : [] []

Bien sûr, vous pouvez déclarer une liste et lui affecter directement des valeurs :

exemple_liste = [8, 6.9, "Kevin"]
print(exemple_liste)

Résultat : [8,  6.9, ‘Kevin’] 

La deuxième syntaxe, list(), est utilisée pour convertir par exemple un tuple en liste. Nous verrons les tuples dans un prochain chapitre mais sachez déjà qu’un tuple est un ensemble d’éléments immuable séparés par des virgules et entourés de parenthèses. En fait, un tuple est une liste qu’on ne peut pas modifier. La seule solution est donc de transformer le tuple en liste.

 tuple_prenoms = ("Gustave", "Solange", "Alphonse")
liste_prenoms = list(tuple_prenoms)
print(liste_prenoms)

Résultat: [‘Gustave’, ‘Solange’, ‘Alphonse’]

La méthode append()

Grâce à la méthode append(), vous pouvez ajouter des éléments qui seront affectés à la fin de la liste.

exemple_liste = [8, 6.9, "Kevin"]
exemple_liste.append("Loana")
print(exemple_liste)

Résultat : [8,  6.9, ‘Kevin’, ‘Loana’]

La fonction intégrée len()

La fonction intégrée len() retourne un entier qui correspond au nombre d’éléments contenus dans la liste passée en argument.

print(len(exemple_liste))

Résultat : 4

Accéder à un élément d’une liste grâce à son indice

exemple_liste contient quatre éléments indicés à partir de zéro, c’est-à-dire que l’indice du quatrième élément est 3. Avec l’indice, il est donc possible d’accéder à un élément précis de la liste.

# Je place l'indice de l'élément recherché entre crochets:
element = exemple_liste[2]
print(element)

Résultat : ‘Kevin’. Cela correspond au troisième élément de la liste c’est-à-dire celui qui porte l’indice 2.

La méthode insert()

La méthode insert(indice, nouvel_element) permet d’intercaler un nouvel élément dans une liste:

exemple_liste.insert(1, "Gabrielle")
print(exemple_liste)

Résultat : [8,  ‘Gabrielle’,  6.9, ‘Kevin’, ‘Loana’]

Cette méthode intercale l’élément passé en argument à l’indice passé en argument. « Gabrielle » se retrouve donc à l’indice 1 et les valeurs qui suivent, changent d’indice (i devient i + 1). Ainsi, le nombre décimal 6.9 qui était à l’indice 1, se retrouve à l’indice 2.

La méthode extend()

La méthode extend() permet de concaténer deux listes :

jours = ["Lundi", "mardi", "mercredi"]
jours2 = ["Jeudi", "Vendredi"]
jours.extend(jours2)
print(jours)

Résultat : [« Lundi », « Mardi », « Mercredi », « Jeudi », « Vendredi »]

Attention! Il ne faut pas confondre extend() et append()!

extend() effectue une concaténation de listes tandis que append() rajoute l’élément passé en argument, à la fin de la liste sur laquelle la méthode est appliquée.

Dans l’exemple précédent, voici ce que j’aurais obtenu si j’avais utilisé la méthode append():

jours = ["Lundi", "mardi", "mercredi"]
jours2 = ["Jeudi", "Vendredi"]
jours.append(jours2)
print(jours)

Résultat :  [« Lundi », « mardi », « mercredi », [« Jeudi », « Vendredi »]]

Je n’ai pas concaténé deux  listes mais j’ai rajouté la liste jours2 aux éléments de la liste jours. Cette dernière ne contient donc pas 5 éléments (comme dans le premier exemple) mais quatre éléments : Trois chaînes de caractères et une liste! Pour vous en convaincre, il vous suffit d’utiliser la fonction intégrée len().

Accéder à un élément d’une liste qui se trouve elle-même dans une autre liste

jours est donc une liste qui contient une autre liste plus petite. Nous avons vu qu’il était possible d’accéder à un élément en utilisant l’indice entouré de crochets.

jours = ["Lundi", "mardi", "mercredi", ["Jeudi", "Vendredi"]]
# Je place l'indice de l'élément recherché entre crochets:
element = jours[2]
print(element)

Résultat : Mercredi

Mais comment faire pour accéder à « Vendredi » qui est un élément de la petite liste qui se trouve en dernière position de la liste principale? C’est très simple! Il suffit d’utiliser cette syntaxe :

jours = ["Lundi", "mardi", "mercredi", ["Jeudi", "Vendredi"]]
# Je place les indices de l'élément recherché entre crochets:
element = jours[3][1]
print(element)

Résultat: Vendredi 

Cette valeur correspond donc à jours[3][1].

  • 3 est l’indice de la petite liste dans la liste principale.
  • 1 est l’indice de « Vendredi » dans la petite liste.

Utiliser le slicing pour modifier une liste

Il est tout à fait possible d’utiliser les crochets et les indices pour insérer ou supprimer des éléments dans une liste. Cette technique s’appelle le slicing. Cela se traduit par découpe en tranches. C’est clairement plus délicat à manipuler que les méthodes mais c’est très efficace et d’une grande souplesse.

Par exemple, au lieu d’appliquer la méthode list.insert(), on peut utiliser la syntaxe list[i:i].

jours = ["Lundi", "Mardi", "Jeudi"]
# Je souhaite insérer "Mercredi"
jours[2:2] = ["Mercredi"]
print(jours)

Résultat: [‘Lundi’, ‘Mardi’, ‘Mercredi’, ‘Jeudi’]

Attention! L’élément à insérer doit forcément être une liste. Si vous n’insérez qu’un seul élément comme dans l’exemple ci-dessus, il faut le présenter entre crochets et par conséquent le convertir en une liste d’un seul élément.

Si vous oubliez les crochets, Python va insérer chaque caractère de la chaîne « Mercredi » en tant qu’élément :

[‘Lundi’, ‘Mardi’, ‘M’, ‘e’, ‘r’, ‘c’, ‘r’, ‘e’, ‘d’, ‘i’, ‘Jeudi’]

Pour faire un print() d’une partie des éléments d’une liste, par exemple les éléments indicés 1 et 2 dans la liste [‘Gabrielle’, ‘Alphonse’, ‘Kevin’, ‘Loana’], le code sera celui-ci :

prenoms =['Gabrielle', 'Alphonse', 'Kevin', 'Loana']
print(prenoms[1:3])

Résultat: [‘Alphonse’, ‘Kevin’]

Dans cette tranche, l’élément indicé 1 est pris en compte tout comme l’élément indicé 2 mais pas l’élément indicé 3! Voici un schéma qui permet de mieux comprendre comment fonctionne le slicing. La tranche [1:3] correspond à « Alphonse » et « Kevin ». La tranche [3:4] correspond au prénom « Loana ».

explication_indice

Si j’insère « Gustave » dans la tranche [1:3], alors ce prénom remplace « Alphonse » et « Kevin ».

prenoms = ['Gabrielle', 'Alphonse', 'Kevin', 'Loana']
prenoms[1:3] = ["Gustave"]
print(prenoms)

Résultat : [‘Gabrielle’, ‘Gustave’, ‘Loana’]

Autres exemples de slicing

  • prenoms[:] = [‘Gabrielle’, ‘Alphonse’, ‘Kevin’, ‘Loana’] (liste entière)
  • prenoms[1:] = [‘Alphonse’, ‘Kevin’, ‘Loana’]
  • prenoms[:-1] = [‘Gabrielle’, ‘Alphonse’, ‘Kevin’]
  • prenoms[:-2] = [‘Gabrielle’, ‘Alphonse’]
  • prenoms[-1] = prenoms[3] = ‘Loana’
  • prenoms[::2] = [‘Gabrielle’, ‘Kevin’]
  • prenoms[::3] = [‘Gabrielle’, ‘Loana’]
  • prenoms[::-1] = [‘Loana’, ‘Kevin’, ‘Alphonse’, ‘Gabrielle’] (inverse les éléments)

Il n’est pas toujours évident de manipuler les indices négatifs. Pour vous faciliter la tâche, il faut savoir que prenoms[-3] correspond à prenoms[len(prenoms) – 3] c’est-à-dire à prenoms[1].

[-1] est un indice négatif particulièrement intéressant car il permet d’accéder au dernier  élément d’une liste sans connaître la longueur de celle-ci.

Il est possible de parcourir une liste en utilisant un pas qui ne prend qu’un élément sur deux [::2] ou qu’un élément sur trois [::3] par exemple. Un pas de [::-1] inverse les éléments d’une liste.

Quelques méthodes associées aux objets de type list()

Nous avons déjà vu list.append(), list.extend() et list.insert(). Il existe également :

  • list.sort()

Effectue le tri d’une liste dans l’ordre numérique croissant (ou dans l’ordre alphabétique croissant).

prenoms = ['Gabrielle', 'Alphonse', 'Kevin', 'Loana']
nombres = [8, 52, 0, 3.2, -5.6, 7, -23]
prenoms.sort()
nombres.sort()
print(prenoms)
print(nombres)

Résultat : [‘Alphonse’, ‘Gabrielle’, ‘Kevin’, ‘Loana’]
                    [-23, -5.6, 0, 3.2, 7, 8, 52]

list.sort() peut prendre l’argument reverse = True. Dans ce cas, le tri est décroissant :

prenoms = ['Gabrielle', 'Alphonse', 'Kevin', 'Loana']
nombres = [8, 52, 0, 3.2, -5.6, 7, -23]
prenoms.sort(reverse = True)
nombres.sort(reverse = True)
print(prenoms)
print(nombres)

Résultat : [‘Loana’, ‘Kevin’, ‘Gabrielle’, ‘Alphonse’]
[52, 8, 7, 3.2, 0, -5.6, -23]

  • list.index()

list.index() retourne l’index de l’élément passé en argument. Si l’élément est absent de la liste, Python lève une exception. Si l’élément est présent plusieurs fois, la méthode retourne l’index de la première occurrence.

prenoms = ['Gabrielle', 'Alphonse', 'Kevin', 'Loana']
nombres = [8, 52, 0, 3.2, -5.6, 7, -23]
i = prenoms.index('Gabrielle')
i2 = nombres.index(53)
print(i)
print(i2)

Résultat : 0

ValueError: 53 is not in list

Si une valeur est présente plusieurs fois, il est possible de passer en argument l’index à laquelle doit débuter la recherche sous la forme list.index(valeur, i):

prenoms = ['Gabrielle', 'Alphonse', 'Kevin', 'Loana', 'Gabrielle']
nombres = [8, 52, 0, 3.2, -5.6, 7, -23]
i = prenoms.index('Gabrielle', 3)
print(i)

Résultat: 4  (la première valeur ‘Gabrielle’ est ignorée)

  • list.reverse()

Cette méthode inverse les valeurs de la liste.

prenoms = ['Gabrielle', 'Alphonse', 'Kevin', 'Loana']
prenoms.reverse()
print(prenoms)

Résultat: [‘Loana’, ‘Kevin’, ‘Alphonse’, ‘Gabrielle’]

  • list.pop()

list.pop() est une drôle de méthode. Elle supprime et retourne par défaut la dernière valeur de la liste. Cette méthode peut prendre un indice en argument. Dans ce cas, c’est la valeur indicée qui est supprimée et retournée. Amusons-nous à poper deux exemples!

prenoms = ['Gabrielle', 'Alphonse', 'Kevin', 'Loana']
popped = prenoms.pop()
print(popped, prenoms)

Résultat: Loana [‘Gabrielle’, ‘Alphonse’, ‘Kevin’]

prenoms = ['Gabrielle', 'Alphonse', 'Kevin', 'Loana']
popped = prenoms.pop(1)
print(popped, prenoms)

Résultat: Alphonse [‘Gabrielle’, ‘Kevin’, ‘Loana’]

  • list.remove()

Cette méthode supprime la première occurrence de la valeur passée en argument. Voici un exemple avec une liste contenant deux « Kevin ».

prenoms = ['Gabrielle', 'Alphonse', 'Kevin', 'Loana', 'Kevin']
prenoms.remove('Kevin')
print(prenoms)

Résultat: [‘Gabrielle’, ‘Alphonse’, ‘Loana’, ‘Kevin’]

  • list.count()

Cette méthode compte le nombre de fois où une occurrence apparaît dans une liste et elle retourne la valeur correspondante.

prenoms = ['Gabrielle', 'Alphonse', 'Kevin', 'Loana', 'Kevin']
n = prenoms.count('Kevin')
print(n)

Résultat: 2

Tester l’appartenance d’une valeur à une liste

L’instruction conditionnelle if… in autorise très facilement ce genre de test. Elle valide la présence ou l’absence de la valeur recherchée dans la liste.

prenoms = ['Gabrielle', 'Alphonse', 'Kevin', 'Loana']
if 'Kevin' in prenoms:
    print("Le test d'appartenance est positif.")
else:
    print("Ce prénom est absent de la liste.")

Résultat : Le test d’appartenance est positif.

prenoms = ['Gabrielle', 'Alphonse', 'Kevin', 'Loana']
result = 'Baptiste' in prenoms # Retourne un booléen (True ou False)
print(result)

Résultat : False

Auteur : Ordinosor

Bienvenue sur Miamondo, mon blog personnel. "Mia mondo", c'est de l'espéranto et ça signifie "Mon monde" en français. Je m'appelle Benoît alias Ordinosor, Français expatrié en Allemagne. Mes centres d'intérêt sont les distributions GNU/Linux, le langage de programmation Python, la science-fiction et l'espéranto.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s