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.
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]
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] |
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
>>> liste1=[1,2] >>> liste2=[3,4,5] >>> liste1+liste2 [1, 2, 3, 4, 5]
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.
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
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]
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]