Page 6

Les listes

Les variables de type list

On peut avoir besoin de regrouper plusieurs données dans une liste de données. On introduit ainsi un nouveau type de variable : les variables de type list.

Exemple : les moyennes de l'année d'Albert qui est en seconde 16 et qui passe en première (True)

>>> liste=['Albert',10, 13, 14.5, 15,'seconde 16',True]
>>> liste,id(liste),type(liste),len(liste)
(['Albert', 10, 13, 14.5, 15, 'seconde 16', True], 38397552, < class 'list' >, 7)

Remarque :
Une liste se définit à l'aide de crochets.
Une liste peut contenir des données de différents types : ici string, int, float, booléen. Pour connaître la longueur d'une liste il suffit d'utiliser la fonction len(...) que nous avons déjà rencontrée.

On peut extraire une des valeurs de cette liste à l'aide de l'instruction liste[indice].
Attention : dans notre cas, comme la liste est de longueur 7, le paramètre indice doit être un entier compris entre 0 et 6.

Exemple :

>>> liste[0],liste[6]
('Albert', True)

Ainsi,

>>> liste[0],type(liste[0])
('Albert', < class 'str' >)
>>> liste[3],type(liste[3])
(14.5, < class 'float' >)
>>> liste[6],type(liste[6])
(True, < class 'bool' >)

Si on veut extraire une partie de la liste, il suffit de taper :

>>> liste[1:4]
[10, 13, 14.5]

Remarque : pour comprendre ce résultat, il ne faut pas s'intéresser aux tranches mais plutôt aux endroits ou l'on coupe la liste.

ImageListe

Dans l'exemple précédent on a coupé en 1 et en 4, on obtient bien la liste : [10,13,14.5]

Voici d'autres exemples que vous pouvez tester pour comprendre comment cela fonctionne.

>>> liste[2:]
[13, 14.5, 15, 'seconde 16', True]
>>> liste[:5]
['Albert', 10, 13, 14.5, 15]
>>> liste[0:len(liste)]
['Albert', 10, 13, 14.5, 15, 'seconde 16', True]
>>> liste[:]
['Albert', 10, 13, 14.5, 15, 'seconde 16', True]

Opérations sur les listes

Modification d'une liste

Changement 1 : La première moyenne doit être modifiée. Elle était de 10. Elle est en fait de 11.

Avant modification Après modification
>>> liste,id(liste)
(['Albert', 10, 13, 14.5, 15, 'seconde 16', True], 38397552)
>>> liste[1]=11
>>> liste,id(liste)
(['Albert', 11, 13, 14.5, 15, 'seconde 16', True], 38397552)

On remarque que l'identifiant de la liste n'a pas changé. On a seulement modifié sa valeur.

Changement 2 : Il n'y avait pas qu'une erreur. Les deux premières moyennes étaient fausses. On modifie alors la liste.

Avant modification Après modification
>>> liste
['Albert', 10, 13, 14.5, 15, 'seconde 16', True]
>>> liste[1:3]=[11,14]
>>> liste
['Albert', 11, 14, 14.5, 15, 'seconde 16', True]

Changement 3 : Une moyenne a été oubliée à l'intérieure de la liste. On l'ajoute !

Avant modification Après modification
>>> liste
['Albert', 10, 13, 14.5, 15, 'seconde 16', True]
>>> liste[0:1]=['Albert',9]
>>> liste
['Albert', 9, 10, 13, 14.5, 15, 'seconde 16', True]

Changement 4 : Et finalement enlevée. On l'enlève !

Avant modification Après modification
>>> liste
['Albert', 9, 10, 13, 14.5, 15, 'seconde 16', True]
>>> liste[0:2]=['Albert']
>>> liste
['Albert', 10, 13, 14.5, 15, 'seconde 16', True]

Attention aux copies de listes !

Examinons attentivement les instructions suivantes .

>>> liste1=['un',1,1.0]          #on crée une première liste
>>> liste1                       #on l'affiche  cette première liste 
['un', 1, 1.0]
>>> liste2=liste1                #on « copie » la liste1 dans une autre liste nommée liste2
>>> liste2                       #on l'affiche cette deuxième liste 
['un', 1, 1.0]                
>>> liste1[0]='deux'             #on modifie la première liste
>>> liste2                       #on l'affiche la deuxième liste 
['deux', 1, 1.0]                 # Surprise : la deuxième liste a été modifiée aussi !

En fait l'instruction liste2=liste1 n'a pas créée un nouvel objet mais à créer un alias de l'objet comme le montre l'affichage des indices.

>>> liste1=['un',1,1.0]
>>> liste1,id(liste1)
(['un', 1, 1.0], 41494248)
>>> liste2=liste1
>>> liste2,id(liste2)
(['un', 1, 1.0], 41494248)
>>> liste1[0]='deux'
>>> liste2,id(liste2)
(['deux', 1, 1.0], 41494248)

Pour copier la liste et obtenir un deuxième objet indépendant, voici comment il faut s'y prendre.

>>> liste1=['un',1,1.0]
>>> liste1,id(liste1)
(['un', 1, 1.0], 41352848)
>>> liste2=copy.deepcopy(liste1)   #on effectue une copie profonde
>>> liste1[0]='deux'               #on modifie la première valeur de la liste 1
>>> liste2,id(liste2)
(['un', 1, 1.0], 41494248)         # liste1 et liste2 sont deux objets différents.
>>> liste1,id(liste1)              # Regardez bien les indices !...   
(['deux', 1, 1.0], 41352848)       # ...Quand on modifie l'un cela ne change pas l'autre      

Concaténation de deux listes :

>>> liste1=[1,2]
>>> liste2=[3,4,5]
>>> liste1+liste2
[1, 2, 3, 4, 5]

Ajout d'un élément à une liste (autres méthodes)

Nous avons déjà vu une méthode qui permet d'ajouter un élément à une liste. En voici d'autres parmi une liste de méthodes très pratiques.

liste1.append(x)                 #Ajoute l'élément x à la fin de l liste1
liste1.extend(liste2)            #ajoute à la fin de la liste1 les éléments de la liste2
liste1.insert(i,x)               #insère un élément x en position i
liste1.remove(x)                 #supprime la première occurrence de x
liste1.index(x)                  #renvoie l'indice de la première occurrence de x
liste1.count(x)                  #renvoie le nombre d'occurrences de x
liste1.sort()                    #modifie la liste en la triant
liste1.reverse(x)                #modifie en inversant l'ordre des élèments

Vous trouverez sur le site de Python la liste complète.

https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range

Avant de passer à la structure répétitive inconditionnelle, c'est à dire la structure For, nous allons parler de l'opérateur logique in et introduire la fonction range.

Opérateur in :

Exemple :

>>> liste1=[1,2,3,4,5]
>>> 1 in liste                    # 1 est-il dans la liste1 ?
True
>>> 6 in liste                    # 6 est-il dans la liste1 ?
False

La fonction range(…) :

Cette fonction permet de générer des entiers un par un. Donnons tout de suite des exemples.

Exemple :

>>> liste2=range(3)       #On crée un itérateur
>>> type(liste2)         
< class 'range' >         # On constate que liste2 n'est pas une variable de type list
>>> 1 in liste2                    
True
>>> 6 in liste2
False
>>> liste2=range(3)               #On crée un itérateur
>>> type(liste2)                  # On constate que liste2 n'est pas une...
>>> 1 in liste2                   #...variable de type liste       
< class 'range' >                                                                       
>>> 0 in liste2, 1 in liste2, 2 in liste2, 3 in liste2   # range génère les entiers 0, 1, 2.
(True, True, True, False)

Cette fonction range peut servir à créer des listes à l'aide du convertisseur de type list(…).

Exemple :

>>> liste1=list(range(5))
>>> liste1,type(liste1)
([0, 1, 2, 3, 4], < class 'list'> )  #permet de créer la liste des entiers de 0 à 4
>>> list(range(2,5))                 #permet de créer la liste des entiers de 2 à 4
[2, 3, 4]
>>> list(range(2,10,2))              #permet de créer la liste des entiers de 2 à 10 (pas de 2)
[2, 4, 6, 8]
>>> list(range(10,0,-1))             #permet de créer la liste des entiers de 10 à 0 (pas de -1)
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Autre manière de créer une liste :

La liste des nombres pairs inférieurs ou égaux à 20 se définit en mathématiques de la manière suivante.

{2*x /x∈{0;1;2;3;4;5;6;7;8;9;10}}

En Python, on écrira, sensiblement la même chose mais entre crochet car il s'agit d'une liste.

>>> [2*x for x in range(0,11)]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]



Page 6