Python: Liste

From Wiki Cours
Jump to navigation Jump to search

Initialisation

Une liste est un tableau ordonné qui contient des pointeurs vers des objets qui peuvent être simplement des données numériques (entiers ou réels) ou des choses plus compliquées comme des nombres complexes ou même des listes. Pour créer une liste vide, on peut faire

a = list()
a = []
print a # affiche la liste

On peut définir une liste en explicitant son contenu, les éléments sont alors séparés par des virgules. Voici un exemple de liste au contenu homogène puis un avec un contenu

a = [1,4,2,3] # une liste d'entiers
a = [ 2, complex(1,3), 4.5, ['a','b','c'] ] # une liste au contenu inhomogène

Indiçage

On accède aux éléments de la liste à l'aide de l'opérateur d'indiçage [] comme en C. De même qu'en C, le premier indice est 0. Cet opérateur permet à la fois d'accéder au contenu stocké à la ième place, via a[i], mais aussi de le modifier.

a = [3,2,1,0]
print a[0],a[1],a[2],a[3]
a[0] = 'a'
print a

Le nombre d'éléments est accessible par la méthode len() selon

print len(a)

Copie d'une liste

Il faut faire attention au fait qu'en Python, qui a un typage dynamique, l'affection suivante fait que la liste b va pointer vers le contenu de a:

a = [3,2,1,0]
b = a

Si l'on modifie un élément de b, le contenu est changé et donc les éléments de a également

a = [3,2,1,0]
b = a
b[2] = 5
print a,b

Pour réellement créer une copie indépendante, il faut générer une nouvelle liste en dupliquant le contenu de a. Il y a deux façons simple de le faire: avec l'initialisateur list() ou l'indiçage du contenu en entier via l'opération [:]

a = [3,2,1,0]
b = list(a)
b[2] = 5
c = a[:]
c[1] = -3
print a,b,c

En fait, il reste cependant un problème dans le cas où la liste contient des éléments qui sont des objets plus compliqués que les types de base (entiers, réels,...), en particulier des listes. Regardons en effet le résultat d'une copie d'une liste de listes:

a = [ [2,3] for i in range(4) ]
b = list(a)
b[2][0] = 5
print a,b

On voit que le contenu de a a été modifié car la copie a copié comme nouvel élément de b l'adresse de la liste élément de a. Pour effectuer une copie complète du contenu à tous les niveaux, Python offre une fonction deepcopy présente dans la bibliothèque copy du standard. Refaire alors

from copy import deepcopy
a = [ [2,3] for i in range(4) ]
b = deepcopy(a)
b[2][0] = 5
print a,b

Noter que cette bibliothèque offre également une fonction copy qui fait la même chose qu'avec list() mais avec un nom plus évocatif et il s'agit surtout d'une méthode plus générique et ré-définissable pour des objets plus complexes.

from copy import copy
a = [ [2,3] for i in range(4) ]
b = copy(a)
...

Génération de listes

Un des points forts de Python est la possibilité de générer et modifier efficacement des listes. Vous pouvez étudier les exemples suivants

N = 5
# addition de liste '+', rajoute un élément ou fusionne deux listes (l'ordre compte)
print [1,2] + [3,4,5],  [3,4,5] + [1,2] 
# opérateur multiplier '*' répète N fois l'addition:
print [1]*N
# vous pouvez combiner ces opérations pour obtenir des structures complexes dès l'initialisation
print ([ [2,3] ]*2 + ['a'])*3

# On peut ajouter un élément avec l'addition ou bien la méthode '''append()'''
a = [ 0 ]*4
a += [1]  # ne pas oublier les crochets ici car il faut ajouter une liste de 1 élément.
a.append(1) # plus efficace, l'argument de append étant l'élément à ajouter, pas de crochets ici.

Méthodes utiles pour les listes