Les listes

Les listes

Une liste est une "collection" d'objets indicés.

Les exemples ci-dessous illustrent la façon dont les éléments sont indicés. Vous retiendrez également de ces exemples les diverses méthodes de parcours des éléments de la liste.


# une liste de nombres
a = [2, 10, 5//3, 7.2, 8]

print("Longueur de la liste a : ", len(a) )

print("La liste : ", a)

On obtient :

Longueur de la liste a :  5
La liste :  [2, 10, 1, 7.2, 8]

# une liste de nombres
a = [2, 10, 5//3, 7.2, 8]

 

print("Contenu, élément un à un : ", a[0],a[1],a[2],a[3], a[4] )
print('\n')



print('Parcours des éléments avec une boucle sur les indices :')
for i in range(len(a)) :
	print(a[i],end=', ')
print('\n')
	

On obtient :

Contenu, élément un à un :  2 10 1 7.2 8


Parcours des éléments avec une boucle sur les indices :
2, 10, 1, 7.2, 8, 

# une liste de nombres
a = [2, 10, 5//3, 7.2, 8]

 
	
print('Parcours des éléments avec une boucle sans les indices :') 
for x in a :
	print(x,end='; ')
print('\n')
	
	
print('Parcours des éléments avec indices et éléments :') 
for i,x in enumerate(a) :
	print("Le terme d'indice {} est {}.".format(i,x) )

On obtient :

Parcours des éléments avec une boucle sans les indices :
2; 10; 1; 7.2; 8; 

Parcours des éléments avec indices et éléments :
Le terme d'indice 0 est 2.
Le terme d'indice 1 est 10.
Le terme d'indice 2 est 1.
Le terme d'indice 3 est 7.2.
Le terme d'indice 4 est 8.
 

On retiendra que les indices, comme pour les chaînes de caractères, commencent à zéro et non à un. Le dernier indice est donc len(a)-1 et non len(a).

Autre exemple :


def f(x) :
	return 5*x**2+3*x+1


# une liste contenant divers objets :
a = [2, 'coucou', f, f(7)]

print("Longueur de la liste a : ", len(a) )

print("La liste : ", a)
print('\n')
	
print('Les éléments de la liste :') 
for i, x in enumerate(a) :
	print("Le terme d'indice {} est {}.".format(i,x))
print('\n')
	
	
print('Les types des éléments de la liste :') 
for i, x in enumerate(a) :
	print( "Le type du terme d'indice {} est {}.".format(i,type(x)) )
print('\n')

On obtient :

Longueur de la liste a :  4
La liste :  [2, 'coucou', function f at 0x7f29b4ab8bf8, 267]


Les éléments de la liste :
Le terme d'indice 0 est 2.
Le terme d'indice 1 est coucou.
Le terme d'indice 2 est function f at 0x7f29b4ab8bf8.
Le terme d'indice 3 est 267.


Les types des éléments de la liste :
Le type du terme d'indice 0 est class 'int'.
Le type du terme d'indice 1 est class 'str'.
Le type du terme d'indice 2 est class 'function'.
Le type du terme d'indice 3 est class 'int'.

Une liste peut donc contenir des objets de types différents.

Créer une liste

Liste vide

Il s'agit de la liste []. Elle permet, par exemple, d'initialisr une variable de type liste au début d'une fonction.


maliste = []

Concaténer

Comme pour les chaines de caractères, on utiliser l'opérateur +. Il crée une nouvelle liste qui contient les éléments des deux opérandes mis bout-à-bout.

Exemple :


    L = [ 1, 2, 5] + [ 'a', 'toto' , 9]
    
    print(L)

Le résultat :

[ 1, 2, 5, 'a', 'toto' , 9]

Liste de n éléments identiques

Comme pour les chaines de caractères, c'est le résultat de l'opérateur * :


    L = [ 19] * 5
    
    print(L)

Le résultat :

[ 19, 19, 19, 19, 19]

Attention ! Cette technique ne doit qu'exceptionnellement être utilisée pour créer une liste de listes. En effet, les listes recopiées sont en fait des références à la même liste de départ, qui si elle est modifiée répercute cette modification à toutes les autres.


    L = [ [1,2]]*3
    
    print("Liste originale : ", L)

    L[0][0] = 5 # on modiie le premier élément de la première liste

    print ("Liste modifiée : ", L) 

Le résultat :

  Liste originale : [[1,2], [1,2], [1,2]]
  Liste modifiée : [[5,2], [5,2], [5,2]]

On observe que les autres listes aussi sont modifiées, en fait ce ne sont pas des copies indépendantes mais des références à la première liste qui sont créées. On traitera plus en détail de ce point plus loin.

Fonction list

Elle est utilisée pour créer une nouvelle liste. Nous l'utiliserons dans 3 cas principalement.


    #premier cas : liste vide
    L1 = list()

    #deuxième cas : liste de caractères
    L2 = list("abracadabra")
    
    #troisième cas : liste de nombres
    L3 = list(range(14,18))

    print ("L1 : ", L1)
    print ("L2 : ", L2)
    print ("L3 : ", L3)

Le résultat :

  L1 : []
  L2 :  ["a", "b", "r", "a", "c", "a", "d", "a", "b", "r", "a"]
  L3 : [14, 15, 16, 17]

La première instruction est un synonyme de L1 = []. Dans les deux autres cas, on transforme en liste un objet que l'on peut parcourir avec un for.

Avec un for : listes en compréhension (approfondissement)

La création des listes L2 et L3 ci-dessus peut être codée d'une autre manière en python, qui est à peu près synonyme.


    L2 = [ x for x in "abracadabra" ]
    
    L3 = [ x for x in range(14,18) ]

    print ("L2 : ", L2)
    print ("L3 : ", L3)

Le résultat :

  L2 :  ["a", "b", "r", "a", "c", "a", "d", "a", "b", "r", "a"]
  L3 : [14, 15, 16, 17]

Cette méthode peut être généralisée en effectuant un traitement sur l'élément qui parcourt la liste initiale.



    #liste des dix premiers nombes paires
    lp = [ 2*x for x in range(10) ]
    
    print (lp)

Le résultat :

  [ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Modifier les éléments d'une liste.

Modifier la valeur d'un élément d'indice connu.


L = ['ba', 'be', 'bi', 'bo', 'bu']

L[2] = 'fifi'

print(L)

La liste L est modifiée :

['ba', 'be', 'fifi', 'bo', 'bu']

Effacer un élément d'indice connu.


L = ['ba', 'be', 'bi', 'bo', 'bu']

del(L[3])

print(L)

L'élément d'indice 3 est ainsi effacé :

['ba', 'be', 'bi', 'bu']

On peut également utiliser pop :


L = ['ba', 'be', 'bi', 'bo', 'bu']

L.pop(3)

print(L)

On obtient :

['ba', 'be', 'bi', 'bu']

Avec pop, on peut en fait également récupérer la valeur de l'élément supprimé en même temps :


L = ['ba', 'be', 'bi', 'bo', 'bu']

a = L.pop(3)

print(L)
print(a)

On obtient :

['ba', 'be', 'bi', 'bu']
bo

Récupérer l'indice d'un élément.

Si on l'on veut connaître l'indice d'un élément présent dans la liste L, on peut utiliser index :


L = ['ba', 'be', 'bi', 'bo', 'bu']

k = L.index('bo')

print(k)

Ce qui donne :

3

Si l'élément a plusieurs occurrences dans la liste L, L.index() renverra le plus petit indice correspondant.


L = ['ba', 'be', 'bi', 'bo', 'bu', 'bo', 'by', 'bo']
k = L.index('bo')
print(k)

Ce qui donne :

3

Si l'élément n'est pas présent dans la liste, python renvoie une erreur :


L = ['ba', 'be', 'bi', 'bu', 'by']
k = L.index('bo')
print(k)

donne :

ValueError: 'bo' is not in list

Pour éviter une erreur, on peut utiliser count qui permet de retourner le nombre d'éléments de valeur donnée présents dans la liste.


L = ['ba', 'bo', 'be', 'bi', 'bu', 'by', 'bo']
compteur = L.count('bo')
print("Nombre de 'bo' présents dans la liste L : ",compteur)

donne :

Nombre de 'bo' présents dans la liste L :  2

et pour éviter une erreur en cas d'absence de la valeur :


L = ['ba', 'bo', 'be', 'bi', 'bu', 'by', 'bo']

if L.count('bo') > 0 :
	print("Premier indice de 'bo' dans la liste L : ", L.index('bo') )
else :
	print("Aucun 'bo' dans cette liste.")

Effacer un élément d'indice inconnu.

Avec remove, on peut supprimer la première occurrence d'une valeur donnée dans la liste. Attention, python retourne une erreur si la valeur n'était pas présente.


L = ['ba', 'bo', 'be', 'bi', 'bu', 'by', 'bo']

if L.count('bo') > 0 :
	L.remove('bo')
	print("Liste L après remove : ", L )
else :
	print("La liste ne contenait aucun 'bo'.")

donne :

Liste L après remove :  ['ba', 'be', 'bi', 'bu', 'by', 'bo']

Ajouter un élément à une liste

append()

On ajoute un élément à une liste L avec L.append(valeur à ajouter). La nouvelle valeur est insérée en fin de liste (et devient donc le dernier élément de la liste après modification) :


L = ['ba', 'bo', 'be', 'bi', 'bu', 'by', 'bo']
L.append('foo')
print(L)
L.append(7)
print(L)

L'affichage obtenu :

['ba', 'bo', 'be', 'bi', 'bu', 'by', 'bo', 'foo']
['ba', 'bo', 'be', 'bi', 'bu', 'by', 'bo', 'foo', 7]

insert()

On peut insérer un élément à une position précise dans une liste avec insert(position, valeur à insérer) :


L = ['ba', 'bo', 'be', 'bi', 'bu', 'by', 'bo']
L.insert(0,'foo')
print(L)
L.insert(2,'fii')
print(L)
L.insert(len(L), 'un ajout à la fin')
print(L)

L'affichage obtenu :

['foo', 'ba', 'bo', 'be', 'bi', 'bu', 'by', 'bo']
['foo', 'ba', 'fii', 'bo', 'be', 'bi', 'bu', 'by', 'bo']
['foo', 'ba', 'fii', 'bo', 'be', 'bi', 'bu', 'by', 'bo', 'un ajout à la fin']

extend()

On peut ajouter les éléments d'une liste M à une liste L :


L = ['ba', 'bo', 'be', 'bi', 'bu', 'by']
M = [ 4.8, 9.3, 7.2]
L.extend(M)
print(L)

L'affichage obtenu :

['ba', 'bo', 'be', 'bi', 'bu', 'by', 4.8, 9.3, 7.2]

Copier une liste.

Il est important de comprendre la différence entre une instruction L= M dans laquelle M est une liste et cette même instruction lorsque M est par exemple de type int, float, str.

Ces différences et les "pièges" à éviter sont à découvrir ici.