Les listes

2.Parcourir une liste

Il est indispensable de pouvoir déterminer le nombre total d'éléments que contient une liste

L'instruction len(), dont on a vu qu'elle renvoie la longueur d'une chaine de caractères, renvoie également la longueur d'une liste

exemple 1

L'exemple 1 illustre le fonctionnement de l'instruction len()

Notez également qu'on peut très bien remplir une liste "à la main", sans passer par la méthode append.

On rappelle que dans l'exemple 1, puisque la longueur de la liste est égale à 4, les quatre éléments ont des indices allant de 0 à 3.

Lorsqu'on veut parcourir une liste, on peut le faire avec une boucle sur les indices, comme l'illustre l'exemple 2

exemple 2

L'instruction à la ligne 2 effectue une boucle sur l'ensemble des éléments de la liste, quelle que soit sa longueur

A la ligne 3 on teste si le caractère 'u' fait partie des caractères qui composent le ième mot de la liste.

Souvent, cependant, on préfère une rédaction plus légère, comme dans l'exemple 3. L'instruction de la ligne 3 parcourt elle aussi tous les éléments de la liste, la variable mot prenant successivement les valeurs 'jour', 'nuit', 'froid' et 'chaud'

exemple 3

Pour ceux qui souhaitent aller un peu plus loin, sachez qu'il est possible de ne parcourir qu'une plage d'indices (voir exemple 4)

exemple 4

exemple 4

EXERCICES

Exercice 1: Définir une fonction qui, en fonction d'une liste quelconque d'entiers positifs, renvoie la sous-liste de la première contenant uniquement les multiples de 5

Exercice 2: Définir une fonction qui, en fonction d'une liste quelconque de réels entre 0 et 1, renvoie la liste de leurs carrés. On pourra tester cette fonction à partir d'une liste de 20 nombres tirés au hasard entre 0 et 1. Les plus curieux pourront constater que si on applique cette fonction à la liste un grand nombre de fois, les éléments se rapprochent tous sensiblement de 0

Exercice 3: L'ordinateur vous demande votre prénom. Ecrire un script qui compte et affiche le nombre de voyelles contenues dans le prénom. (pour simplifier on supposera que le prénom est écrit sans accent et en lettres minuscules)


Correction exercice 1

# un script possible

def Multiples5(Liste):

# extrait les multiples de 5 d'une liste. Etre multiple de 5 signifie, par exemple, que le reste dans la division euclidienne par 5 est nul

L=[]

for n in Liste:

if n%5==0:

L.append(n)

return (L)






Correction exercice 2

# un script possible

def Carrés(Liste):

L=[]

for x in Liste:

L.append(x*x)

return L







Correction exercice 3

# un script possible

prenom = input('quel est ton prénom? ')

n = 0

for lettre in prenom:

if lettre=='a' or lettre=='e' or lettre=='i' or lettre=='o' or lettre=='u' or lettre=='y':

n = n+1

print('dans ton prénom, il y a',n,'voyelle(s)')


# un autre script possible.

prenom = input('quel est ton prénom? ')

n = 0

voyelles = ['a','e','i','o','u','y']

for lettre in prenom:

if lettre in voyelles:

n = n+1

print('dans ton prénom, il y a',n,'voyelle(s)')






Quelques rappels valables aussi bien pour les listes que pour les chaines de caractères

  • in list, in string condition d'appartenance, utile pour les boucles ou les tests notamment

  • list[ :i ], string[ :i ] parcourt tous les éléments ou caractères jusqu'à l'indice i -1 compris

  • list[ i: ], string[ i: ] parcourt tous les éléments ou caractères depuis l'indice i compris

  • list[ i:j ], string[ i:j ] parcourt tous les éléments ou caractères depuis l'indice i jusqu'à l'indice j - 1 compris tous les deux

3. Agir sur une liste

Voici quelques unes des méthodes spécifiques aux listes:

  • .append(element) ajoute element en fin de liste

  • .insert(i,element) insert element dans la liste à l'indice i

  • .pop(i) enlève l'élément de la liste qui a pour indice i

  • .remove(element) enlève le premier élément de la liste qui est égal à element

  • .sort() trie la liste par ordre croissant (ou ordre alphabétique).

  • .sort(reverse=True) trie la liste dans l'ordre décroissant (ou ordre anti-alphabétique)

exemple 5

Une méthode est une 'action' spécifique à un objet particulier. Les listes possèdent plusieurs méthodes spécifiques dont vous trouverez facilement la liste exhaustive sur internet. L'objectif ici n'est pas de rentrer dans le détail, mais simplement de mentionner que des méthodes existent.

Par ailleurs, dans l'exemple 5, vous trouverez la syntaxe correcte pour les utiliser.

Afin de pouvoir bénéficier des méthodes spécifiques aux listes notamment, il peut être intéressant de convertir un objet existant en une liste. On peut le faire grâce à l'instruction list(), comme vous pouvez le constater dans l'exemple 6

exemple 6

Utiles, les instructions min(liste) et max(liste) renvoient respectivement la valeur minimale et la valeur maximale d'une liste de nombres

Enfin, pour terminer, on peut mentionner l'instruction choice (intégrée au module random) qui simule le tirage aléatoire d'un élément dans une liste (sans l'extraire de la liste).

Recopiez et exécutez l'exemple 7 pour observer son fonctionnement

exemple 7

EXERCICES

Exercice 4: Simuler le tirage aléatoire de 7 nombres entiers ente 1 et 20 compris, tous distincts

Exercice 5: Définir une fonction qui, en fonction d'une liste quelconque d'entiers positifs, renvoie l'écart le plus petit et l'écart le plus grand entre deux nombres de la liste

Correction exercice 4

# un script possible

from random import randint

liste = []

for i in range(7):

n = randint(1,20)

while n in liste: # tant que le nombre aléatoire correspond à un nombre déjà tiré, on en tire un autre

n = randint(1,20)

liste.append(n)

print(liste)


# un autre script possible, qui utilise la méthode .remove d'une liste

from random import choice

univers = list(range(1,21))

liste=[]

for i in range(7):

n = choice(univers)

univers.remove(n)

liste.append(n)

print(univers,liste)







Correction exercice 5

# un script possible. L'écart maximal ne pose aucun problème si on utilise les instructions min et max. La difficulté réside dans l'obtention de l'écart minimal. Dans ce script on a décidé de trier d'abord la liste dans l'ordre croissant pour pouvoir s'intéresser à la différence entre deux éléments consécutifs. De manière à déterminer laquelle de ces différences est la plus petite, on les range dans une liste puis on utilise l'instruction min. Néanmoins, cette méthode présente deux inconvénients: on ne sait pas qui sont les éléments les plus proches et on a modifIé la liste originelle (elle est maintenant rangée dans l'ordre croissant).

def Ecarts (liste):

GrandEcart = max(liste)-min(liste)

liste.sort()

EcartsConsécutifs = []

for i in range (len(liste)-1):

EcartsConsécutifs.append(liste[i+1]-liste[i])

PetitEcart = min(EcartsConsécutifs)

return PetitEcart,GrandEcart


# Pour ne pas modifier la liste de départ, on peut en effectuer une copie:

def Ecarts (liste):

GrandEcart = max(liste)-min(liste)

L = liste.copy()

L.sort()

EcartsConsécutifs = []

for i in range (len(L)-1):

EcartsConsécutifs.append(L[i+1]-L[i])

PetitEcart = min(EcartsConsécutifs)

return PetitEcart,GrandEcart