
Dans cette leçon vidéo, le présentateur explique en détail le type de donnée liste en Python. Il commence par définir les listes comme des séquences pouvant contenir plusieurs valeurs de types différents, montre comment les créer (syntaxe avec crochets, conversion de type) et comment vérifier leur type. Il décrit l’accès aux éléments via les indices, y compris les indices négatifs, et la modification d’éléments. Il explique comment obtenir la taille d’une liste avec len et comment parcourir une liste avec une boucle for, soit sur les éléments, soit sur leurs indices via range(len). Il couvre les opérateurs d’appartenance (in, not in) et les méthodes index et count pour localiser ou compter des valeurs. Il détaille les méthodes de modification : append, insert, extend, pop, del, remove, ainsi que reverse et sort (avec l’option reverse=True). Il montre l’utilisation des opérateurs de concaténation (+) et de répétition () sur les listes. Le slicing (tranchage) est présenté avec les paramètres start:stop:step, les indices positifs et négatifs, et les slices inversés. Enfin, il explique la différence entre affectation de référence et création de copies, en présentant quatre techniques de copie (copy(), slicing, concaténation/répétition, cast List()). Le cours se conclut en rappelant que ces notions seront utiles pour d’autres séquences comme les chaînes de caractères.
Chapters
Bonjour à tous et bienvenue dans cette nouvelle leçon sur le langage de programmation Python. Aujourd'hui, nous allons voir les listes. En Python, les listes font partie de la famille des séquences qui sont des structures de données qui contiennent des éléments plus petits. Comme on l'a vu dans la vidéo consacrée à la boucle for, la fonction range permet de créer une séquence de nombres et une chaîne de caractères est une séquence de caractères. On peut définir une liste comme étant une variable qui contient plusieurs valeurs. À l'inverse des variables de base, comme les entiers ou les booléens qui ne peuvent contenir qu'une seule valeur à la fois, une liste peut renfermer plusieurs valeurs en même temps, et chacune de ces valeurs est accessible via un numéro que l'on appelle indice. Pour créer une liste, on utilise la syntaxe suivante: lst est l'identifiant de la liste, qui n'est rien d'autre qu'une variable. Les crochets indiquent qu'il s'agit d'une liste et non pas d'une variable ordinaire. Dans ce cas, nous avons créé une liste vide. On peut aussi faire ceci, mais cette syntaxe de transtypage est rarement utilisée pour créer une liste vide. Si on écrit cette instruction, dans ce cas nous avons créé et initialisé notre liste lst en y plaçant les valeurs 10, 15 et 19 en même temps. Notez qu'on n'est pas obligé de mettre des valeurs du même type dans la liste, mais plusieurs types peuvent y être placés comme ceci. Dans ce cas, la liste contient 3 valeurs qui sont respectivement de type entier, booléen et chaîne de caractères. On peut même placer une liste dans une autre, mais on traitera ce cas plus tard. Maintenant, si on affiche type lst, on aura class list. Notez qu'il est conseillé de vérifier le type des variables de temps à autre pour être sûr si ce type correspond bien à ce que l'on attend, d'autant plus que Python utilise le typage dynamique, donc c'est l'interpréteur qui décide du type. Reprenons la liste qui contient les valeurs 10, 15 et 19. Pour accéder à une valeur dans la liste, on utilise les crochets dans lesquels on place l'indice de la valeur recherchée. L'indice n'est rien d'autre que la position de l'élément et qui commence à 0 et s'incrémente de 1. Donc, pour accéder à la valeur 10, on met lst . Notez qu'on peut récupérer cette valeur et on peut aussi la modifier. Par exemple, si on met print , alors on affiche 10. Et si on met lst= 20, alors la valeur de la position 1 vaut désormais 20 et non plus 15. Il est possible d'afficher la liste en intégralité comme ceci: print lst. On ne met pas de crochets devant l'identifiant de la liste dans ce cas. Les indices sont ordonnés dans l'ordre de spécification des valeurs de la liste, donc le premier élément est indexé par 0, le deuxième élément par 1 et le troisième élément par 2. Il est toutefois possible d'indexer les éléments dans l'ordre inverse, c'est-à-dire du dernier au premier. Dans ce cas, on utilise les indices négatifs comme ceci: L'élément 19 est indexé par -1, l'élément 15 par -2 et l'élément 10 par -3. Autrement dit, les écritures lst et lst font référence au même élément qui est 19. Notez que si vous tentez d'accéder à un indice qui n'existe pas dans la liste, alors vous aurez une erreur qui dit: List index out of range, qui signifie tout simplement indice inexistant. Si vous voulez connaître le nombre d'éléments dans la liste, alors on utilise la fonction len. Par exemple, si on affiche len lst, on aura 3, car la liste contient 3 éléments. On peut parcourir la liste à l'aide d'une boucle, de préférence la boucle for car le nombre d'éléments de la liste est connu à l'avance. On peut donc procéder de 2 façons différentes: soit on parcourt la liste à travers ses éléments, ou bien on la parcourt à travers les indices de ses éléments. Par exemple, si on met for i in liste, dans ce cas on parcourt la liste à travers ses éléments, et par conséquent à chaque itération de la boucle on affecte à la variable i la valeur de l'élément courant, donc 10, puis 15, puis 19. Et si on fait ceci: for i in range len, dans ce cas on parcourt la liste à travers les indices de ses éléments, ce qui veut dire qu'on affecte à i les indices 0, puis 1, puis 2. Vous avez remarqué qu'on a placé len lst dans la fonction range, ce qui revient à faire range car la liste contient 3 éléments. Et comme on l'a vu dans la vidéo consacrée à la boucle For, range signifie que la séquence générée commence à 0 et finit à 3- 1, donc 2. Si on veut afficher les valeurs de la liste plutôt que ses indices, alors on remplace i par lst Dans . ce cas on affiche lst qui vaut 10, lst qui vaut 15 et enfin lst qui vaut 19. Si on veut vérifier qu'une valeur figure dans la liste, alors on peut utiliser l'opérateur d'appartenance In comme pour la boucle For. Par exemple, si on exécute l'instruction Print 15 In lst, alors on aura True car 15 figure bien dans la liste. On peut améliorer l'affichage en imprimant un message personnalisé à l'aide de la structure If-Else comme ceci. Si on met not in, alors on vérifie plutôt si l'élément ne figure pas dans la liste, mais il faut permuter les instructions print dans ce cas. Si on veut connaître la position d'un élément dans la liste et pas seulement vérifier s'il existe ou non, alors on fait appel à la méthode index. Je rappelle que le terme méthode signifie fonction, mais qui est utilisé dans un contexte un peu spécial. On aura l'occasion de traiter cela en détail plus loin dans ce cours. La méthode index permet de retourner la position ou l'indice de l'élément qui est passé en argument. Par exemple, lst index 10 renvoie 0, c'est-à-dire que l'élément 10 figure à la position 0 de lst, et lst index 19 renvoie 2, puisque l'élément 19 figure à la position 2. Si l'élément spécifié figure plusieurs fois dans la liste, alors c'est la position du premier rencontré qui sera retournée. On peut aussi utiliser la méthode count qui permet de retourner la fréquence d'un élément dans la liste, c'est-à-dire le nombre de fois que cet élément figure dans celle-ci. Par exemple, si on exécute lst.count, on aura à l'écran la valeur 1 car l'élément 15 figure une seule fois dans la liste. Et si on remplace 15 par 19 dans la méthode count, alors on aura 2 car 19 figure 2 fois. Si un élément ne figure pas dans la liste, alors la méthode count retourne 0. Si on souhaite ajouter un élément à la liste, on utilise la méthode append comme ceci. Dans ce cas, on ajoute dynamiquement l'élément 12 à la fin de notre liste. Et si on veut insérer un élément à n'importe quelle position, alors on fait appel à la méthode insert de cette façon. Dans ce cas, on insère l'élément 20 à la position 1. Ce qui changera automatiquement les indices de tous les éléments suivants. On peut ajouter plusieurs éléments à une liste en une seule fois. Pour cela, on fait appel à la méthode extend comme ceci: Dans ce cas, on a ajouté 12, 18 et 20 à notre liste. Notez que ces valeurs doivent être placées entre des crochets, car extend n'accepte qu'un seul argument qui est une séquence aussi. Dans l'exemple, cette séquence est une liste qui contient les éléments 12, 18 et 20. Figurez-vous que l'on peut ajouter d'autres formes de séquences, connues aussi sous le nom d'itérables, mais je préfère ne pas trop pousser ces notions-là et se contenter de ça pour l'instant. Si on veut supprimer un élément de la liste alors il y a 2 méthodes, soit on spécifie son indice ou carrément sa valeur. Par exemple, exécutons l'instruction lst.pop. Dans ce cas, la méthode pop supprime l'élément qui figure à la position 2. Donc l'élément 19. On peut également remplacer la méthode pop par la fonction del comme ceci. Là encore, on supprime l'élément à la position 2 dans la liste exactement comme le fait la méthode pop. Sinon, on peut utiliser la méthode remove. La méthode remove supprime le premier élément qui a la valeur 19 rencontré dans la liste. Remarquez qu'on doit passer la valeur à supprimer à la méthode remove et non pas sa position, c'est-à-dire son indice. Si on veut inverser notre liste, c'est-à-dire reclasser les éléments du dernier au premier, alors on fait appel à la méthode reverse. Pour trier une liste, on utilise la méthode sort. Nous allons insérer d'autres éléments dans la liste pour mieux voir l'effet du tri. Dans ce cas, les éléments sont triés dans l'ordre croissant. Et si on veut trier la liste dans l'ordre décroissant, alors on ajoute l'option reverse égal à True dans la méthode sort. Les opérateurs de chaînes que nous avons vus dans la vidéo consacrée aux opérateurs sont également applicables aux listes. En guise de rappel, ces opérateurs sont la concaténation représentée par le symbole et la répétition représentée par le symbole*. Imaginez que l'on a initialisé 2 listes lst1 et lst2 comme ceci: La concaténation de lst1 et lst2 va créer une autre liste qu'on a identifiée par lst et qui contiendra tous les éléments de lst1 et lst2 réunis, en respectant leur ordre de déclaration. La répétition consiste à répéter une liste autant de fois que l'on souhaite en la multipliant par un entier. Notez que j'ai utilisé le terme multiplier juste pour vous rapprocher l'idée, mais il s'agit d'une répétition et non pas d'une multiplication qui est une opération arithmétique. Si on suppose qu'on a initialisé une liste identifiée par lst1 comme ceci. Ensuite, nous avons créé une autre liste identifiée par lst2 et qui est le résultat de la répétition de lst1 3 fois. Donc lst2 n'est rien d'autre qu'une grande liste constituée des éléments de lst1 répétés 3 fois. La répétition est souvent pratique si on veut initialiser une liste à la volée de telle sorte qu'elle contienne la même valeur, comme la liste de 0 qui est utile dans certains problèmes liés aux calculs scientifiques. Par exemple, si on veut créer une liste identifiée par lst et qui contient 20 0, nous allons juste faire ceci: En effet, nous avons répété une liste qui contient un seul 0 20 fois, ce qui donne une liste qui contient 20 0. Imaginez maintenant que l'on souhaite récupérer non pas un seul élément de la liste, mais plusieurs éléments en même temps. Alors on procède au découpage de la liste appelé aussi tranchage ou slicing en anglais. Imaginez que l'on dispose de la liste lst qui contient cette fois quelques lettres de l'alphabet, comme ceci. En guise de rappel, si on veut récupérer la lettre C, alors on peut y accéder soit via l'indice positif 2 ou l'indice négatif -4. Mais si cette fois on veut récupérer les lettres A, B et C, toujours sous forme d'une liste, alors on procède au slicing comme ceci: lst La . présence de deux points dans les crochets signifie un intervalle d'indices et non pas un indice unique. Dans ce cas, on récupère les éléments présents à la position 0, 1 et 2. Notez que 3 est exclu exactement comme c'est le cas pour la fonction range. Puisque le premier indice est 0, alors on peut ne pas l'expliciter, ce qui donne lst . Maintenant si on met lst:, dans ce cas toute la liste sera récupérée, car le fait de ne pas spécifier le début de la tranche signifie qu'on commence implicitement au début de la liste, et pareil pour la fin de la tranche qui n'est pas spécifiée et qui sous-entend la fin de la liste. On peut aussi utiliser les indices négatifs comme ceci: lst Dans ce cas, on commence à la position -6 qui correspond à l'élément A et on finit à l'indice -4 qui correspond à la lettre C. Donc, on obtient la tranche . N'oubliez pas qu'on s'arrête toujours à la position avant la position finale explicitée dans la tranche. On peut également mettre les indices positifs et négatifs en même temps comme ceci: et ] qui donnera toujours la même tranche, c'est-à-dire Comme pour la fonction Range, on peut ajouter un troisième paramètre qui signifie le pas du slice. Par exemple, si on met lst , cela signifie que la tranche qui sera récupérée commence à la position 0 et finit à la position 5- 1, donc 4, mais on se déplace de 2 positions par 2, donc on saute une position à chaque fois, ce qui donne la tranche A, C, E. Cette écriture lst::-1 signifie que l'on récupère un slice qui est une copie inversée de la liste d'origine. En effet, nous n'avons pas spécifié la position de début et de fin de la tranche, donc elles correspondent automatiquement aux extrémités de la liste. Le pas -1 signifie que l'on évolue dans le sens inverse, donc on obtient F, E, D, C, B, A. Une dernière chose encore: imaginez que l'on a initialisé la liste lst1 avec les éléments A, B et C. Ensuite, nous avons affecté lst1 à lst2. Donc c'est comme si on a créé une deuxième liste identifiée par lst2 et qui contient les mêmes éléments que lst1. Maintenant, ajoutons l'élément d à la liste lst1. Si on affiche lst2, on constate que l'élément d a été ajouté aussi, alors que dans le code, nous avons ajouté cet élément à lst1 et non pas à lst2. En réalité, c'est normal d'avoir ce comportement. Car le fait d'affecter une liste à une autre ne crée pas une copie de la liste originale mais une référence de cette liste-là. Pour simplifier, on va dire que la liste initiale qui contient les éléments a, b et c a été identifiée par lst1 lors de la première instruction. La deuxième instruction qui consiste à affecter lst1 à lst2 n'a pas créé une nouvelle liste avec les mêmes valeurs, mais il a juste créé un autre identifiant nommé lst2 pour la même liste qu'on avait déjà initialement. C'est ce qu'on appelle affectation de référence. Autrement dit, lst1 et lst2 font référence à la même liste, donc si on change lst1 alors lst2 change aussi et inversement. Si vous avez eu l'occasion de programmer en C et que vous avez manipulé les pointeurs, ce principe vous semblera très familier. En tout cas, pour créer une copie d'une liste et non pas une référence de la même liste, on peut procéder de 4 méthodes différentes. La première méthode consiste à affecter une copie de lst1 à lst2 via la méthode copie comme ceci. Alors on dispose désormais de 2 listes séparées. Donc si on change lst1, la liste lst2 ne change pas car c'est une autre liste. La deuxième méthode consiste à affecter lst1 à lst2 en appliquant le slicing comme ceci. Donc on obtient encore une copie de la liste initiale, ce qui veut dire qu'on dispose de 2 listes différentes lst1 et lst2. La troisième méthode consiste à affecter lst1 à lst2 en appliquant une opération à lst1 comme la concaténation ou la répétition comme ceci. La quatrième méthode consiste à affecter lst1 à lst2 en appliquant le transtypage ou le cast avec le type List comme ceci. En réalité, on n'a pas vraiment changé le type de lst1 car car depuis le début c'était une liste, mais le fait de la transtyper ainsi donne un signal à l'interpréteur comme quoi on veut créer une copie à part de lst1 et que l'on affecte à lst2. Il reste encore les tableaux à 2 dimensions ou plus, ainsi que la technique de compréhension de liste qui permet de créer une liste plus ou moins complexe dans une seule instruction, mais je préfère traiter ces 2 points plus tard afin que la vidéo ne soit pas trop longue. J'espère que vous avez compris comment manipuler les listes en Python. Et sachez que les acquis de cette leçon nous seront utiles pour le traitement d'autres séquences comme les chaînes de caractères. Merci pour votre attention et à la vidéo prochaine.
More from Yamossoun

Algorithme de calcule de la racine carrée par dichotomie #dichotomy #squareroot #algorithm









