Listes et boucles for#

Qu'est-ce qu'une liste ?#

Là où une variable de type int, float, str, ou bool ne peut contenir qu'une seule valeur, une liste (type list) peut en contenir plusieurs. Les listes sont très pratiques quand un programme contient une grande quantité de données, afin de toutes les enregistrer dans une seule variable.

Une liste est entourée de crochets [] et ses valeurs sont séparées par des virgules ,.

panier = ["Poires", "Champignons", "Raviolis", "Pêches"]
print("Dans le panier il y a :", panier)
notes_math = [3.5, 4.8, 5.7, 4.1, 4.5, 5, 3.8, 5.9, 3.2, 4.4, 6]
print("Mes notes en math sont :", notes_math)

Astuce

Pour écrire des crochets sur :

  • Windows : [ AltGr+ è ou ] AltGr+ !

  • Mac : [ Option+ 5 ou ] Option+ 6

Indexation#

L'indexation permet d'accéder à un élément précis d'une liste. Pour ce faire, on fait suivre la liste d'une paire de crochets [] entre lesquels on écrit l'index de l'élément souhaité. L'index correspond à la position de l'élément dans la liste, sachant que le premier élément a l'index 0, le deuxième l'index 1, etc.

1joueurs = ["Sommer", "Akanji", "Xhaka", "Embolo", "Freuler", "Vargas"]
2
3print("Liste complète :", joueurs)
4print("Premier joueur :", joueurs[0])
5print("5ème joueur :", joueurs[4])

Un index peut aussi être contenu dans une variable, ce qui permet par exemple de laisser l'utilisateur choisir l'élément à afficher.

1joueurs = ["Sommer", "Akanji", "Xhaka", "Embolo", "Freuler", "Vargas"]
2
3index = int(input("Quel index sélectionnes-tu ?"))
4print("Tu as sélectionné :", joueurs[index])

Important

  • Le premier élément d'une liste est toujours à l'index 0.

  • Dans une liste de n éléments, le dernier élément sera à l'index n-1.

Fonctions sur les listes#

En Python, il existe de nombreuses fonctions très pratiques pouvant être utilisées sur les listes. Voici celles que nous utiliserons dans ce cours.

  • len(ma_liste) : retourne le nombre (=la longueur) d'éléments dans ma_liste

    lettres = ["S", "A", "L", "U", "T"]
    print(len(lettres))
    
  • ma_liste.append(element) : ajoute un élément à la fin de ma_liste

    outils = ["tournevis", "vis", "vis", "vis", "clous", "marteau"]
    outils.append("scie")
    outils.append("hache")
    print(outils)
    
  • ma_liste.remove(element) : retire 1x l'élément de ma_liste

    outils = ["tournevis", "vis", "vis", "vis", "clous", "marteau"]
    outils.remove("clous")
    outils.remove("vis")
    print(outils)
    

Contrôler si un élément est dans une liste#

Sans lire manuellement chaque élément d'une liste, il est possible de tester si un élément en fait partie grâce à la structure if element in liste. Par exemple, le programme ci-dessous contrôle si un prénom fait partie des invités d'une fête.

1invités = ["Mila", "Loris", "Anja", "Kilian", "Sara", "Pedro"]
2prénom = input("Quel est ton prénom ?")
3
4if prénom in invités:
5    print("Bienvenue à la fête,", prénom)
6else:
7    print("Désolé, tu n'es pas sur la liste")

La liste peut même être écrite directement dans la condition :

1achat = input("Qu'as-tu acheté ?")
2
3if achat in ["pomme", "poire", "pêche", "abricot", "raisin"]:
4    print("C'est un fruit")
5elif achat in ["poivron", "chou-rouge", "carotte"]:
6    print("C'est un légume")
7else:
8    print("Je ne sais pas ce que c'est")

Parcourir chaque élément d'une liste#

Quand on traite les éléments d'une liste, il est courant de vouloir exécuter la même opération pour chacun de ses éléments. En Python, l'instruction Pour chaque ... dans ... se traduit avec les mots-clefs for ... in .... Les instructions indentées en dessous sont exécutées en boucle pour chaque élément de la liste : la nouvelle variable définie après le for prend tour à tour la valeur de chaque élément de la liste placée après le in.

1invités = ["Mila", "Loris", "Anja", "Kilian", "Sara", "Pedro"]
2
3#Pour chaque prénom dans la liste des invités
4for prénom in invités:
5    print("Bonjour", prénom)

La boucle for est souvent combinée à une variable qui accumule un résultat au fil des tours. Dans l'exemple ci-dessous, le programme compte le nombre de notes insuffisantes d'une liste.

 1notes = [4.5, 5.75, 3.5, 4.25, 3, 5, 3.75, 4.5]
 2nb_insuffisantes = 0
 3
 4#Pour chaque note dans la liste des notes
 5for note in notes:
 6    if note < 4:
 7        print(note, ": Tu peux faire mieux !")
 8        nb_insuffisantes = nb_insuffisantes + 1
 9    else:
10        print(note, ": Bravo !")
11
12print("Au total il y a", nb_insuffisantes, "notes insuffisantes")

Important

  • for element in liste parcourt tous les éléments de la liste, du premier au dernier.

  • Une variable qui accumule un résultat (un total, un compteur, un maximum) se définit avant la boucle, puis se met à jour dans la boucle.

La boucle for avec range()#

La fonction range() produit une suite de nombres entiers. Combinée à une boucle for, elle permet de répéter un bloc d'instructions un nombre précis de fois, sans devoir gérer soi-même un compteur comme avec un while. Les deux programmes ci-dessous affichent par exemple exactement la même chose.

Avec whileAvec for ... in range()
compteur = 0
while compteur < 5:
    print(compteur)
    compteur = compteur + 1
for compteur in range(5):
    print(compteur)

La fonction range() peut recevoir un, deux ou trois paramètres. Dans tous les cas, la valeur de fin n'est jamais atteinte : elle est exclue de la suite.

Instruction

Nombres produits

Explication

range(5)

0, 1, 2, 3, 4

de 0 jusqu'à 5 (exclu)

range(2, 6)

2, 3, 4, 5

de 2 jusqu'à 6 (exclu)

range(0, 10, 3)

0, 3, 6, 9

de 0 jusqu'à 10 (exclu), de 3 en 3

range(10, 0, -2)

10, 8, 6, 4, 2

de 10 jusqu'à 0 (exclu), en descendant de 2 en 2

1print("Compte à rebours :")
2for i in range(10, 0, -1):
3    print(i)
4print("Décollage !")

Parcourir les index d'une liste#

En combinant range() et len(), on obtient la suite de tous les index d'une liste : range(len(ma_liste)). Cela est utile lorsqu'on a besoin de connaître la position de chaque élément, et pas seulement sa valeur. Dans l'exemple ci-dessous, la variable i prend tour à tour les valeurs 0, 1, 2, etc., et arrivée[i] donne le coureur à cette position.

1arrivée = ["Isaac", "Victor", "Pascal", "Lucien", "Bruno", "Aurélien"]
2
3for i in range(len(arrivée)):
4    print(i + 1, ":", arrivée[i])

Connaître l'index permet aussi d'accéder aux voisins d'un élément. Le programme ci-dessous compare chaque température à celle du jour suivant pour compter le nombre de jours où il a fait plus chaud que la veille. Comme le dernier élément n'a pas de suivant, la boucle s'arrête à l'avant-dernier index, d'où le len(températures) - 1.

1températures = [12, 15, 14, 17, 19, 16, 18]
2nb_hausses = 0
3
4for i in range(len(températures) - 1):
5    if températures[i + 1] > températures[i]:
6        nb_hausses = nb_hausses + 1
7
8print("La température a augmenté", nb_hausses, "fois")

Important

  • range(fin), range(début, fin) et range(début, fin, pas) : la valeur de fin est toujours exclue.

  • for element in liste donne directement les valeurs de la liste.

  • for i in range(len(liste)) donne les index de la liste : la valeur s'obtient alors avec liste[i].

Exercices#

Exercice 14#

Les trois instructions ci-dessous sont exécutées l'une après l'autre. Suivez le contenu de la liste à la main, puis répondez.

sac = ["pomme", "pain", "eau"]
sac.append("pomme")
sac.remove("pomme")
  1. À la fin, que vaut len(sac) ?

  2. À la fin, que vaut sac[0] ?

  3. À la fin, que vaut sac[2] ?

Exercice 15#

Pour chacun des programmes ci-dessous, indiquez ce que vaut la variable indiquée à la fin de l'exécution. Répondez sans exécuter les programmes : parcourez la liste à la main, élément par élément.

  1. Que vaut total ?

    nombres = [3, 7, 2, 9]
    total = 0
    for n in nombres:
        total = total + n
    
  2. Que vaut compteur ?

    mots = ["chat", "chien", "rat", "souris"]
    compteur = 0
    for m in mots:
        if len(m) > 3:
            compteur = compteur + 1
    
  3. Que vaut resultat ?

    notes = [3, 5, 4, 6]
    resultat = 0
    for note in notes:
        resultat = note
    
  4. Que vaut produit ?

    valeurs = [2, 3, 4]
    produit = 1
    for v in valeurs:
        produit = produit * v
    
  5. Que vaut mot ?

    lettres = ["P", "Y", "T", "H", "O", "N"]
    mot = ""
    for l in lettres:
        mot = mot + l
    

Exercice 16#

Pour chacun des programmes ci-dessous, indiquez ce que vaut la variable indiquée à la fin de l'exécution. Répondez sans exécuter les programmes : écrivez d'abord la suite de nombres produite par le range(), puis suivez la boucle tour après tour.

  1. Que vaut total ?

    total = 0
    for i in range(5):
        total = total + i
    
  2. Que vaut total ?

    total = 0
    for i in range(1, 6):
        total = total + i
    
  3. Que vaut total ?

    total = 0
    for i in range(0, 10, 3):
        total = total + i
    
  4. Que vaut compteur ?

    compteur = 0
    for i in range(10, 0, -2):
        compteur = compteur + 1
    
  5. Que vaut compteur ?

    valeurs = [3, 7, 5, 8, 2, 9]
    compteur = 0
    for i in range(len(valeurs) - 1):
        if valeurs[i] > valeurs[i + 1]:
            compteur = compteur + 1
    

Exercice 17#

Chacun des programmes suivants comporte au moins une erreur. Parfois, cette erreur fait directement buguer le programme avec un message d'erreur rouge. D'autres fois, le programme s'exécute correctement, mais son résultat n'est pas logique.

Corrigez chacun de ces codes de manière à ce qu'ils s'exécutent correctement et affichent un résultat logique.

  1. 1sac = [] #Définit une liste vide
    2objet = input("Quel objet veux-tu mettre dans ton sac ?")
    3while objet != "STOP":
    4    append(sac.objet)
    5    objet = input("Quel autre objet veux-tu mettre dans ton sac ?")
    6print("Contenu du sac", sac)
    
  2. 1#Retire tous les 0 de la liste
    2bits = [1, 0, 1, 1, 0, 1, 0] #Ne pas toucher à cette ligne
    3bits.remove(0)
    4print(bits)
    
  3. 1#Affiche la liste des tâches à faire avec le texte TODO avant chaque tâche
    2todo = ["Réviser math", "Devoir de français", "Apprendre Scedryk par coeur"]
    3for tâche in todo:
    4    print("TODO :", todo)
    
  4.  1votes = ["oui", "non", "non", "oui", "oui", "non", "non", "oui", "non", "oui", "oui"]
     2oui = 0
     3non = 0
     4for v in votes:
     5    if v == "oui":
     6        oui += 1
     7    elif v == "non":
     8        non += 1
     9
    10    if oui > non:
    11        print("Les OUI l'emportent")
    12    elif non > oui:
    13        print("Les NON l'emportent")
    14    else:
    15        print("Egalité")
    
  5. 1#Affiche les nombres de 1 à 10
    2for i in range(10):
    3    print(i)
    
  6. 1#Compte combien de fois un nombre est suivi d'un nombre plus grand
    2nombres = [4, 9, 2, 7, 7, 10]
    3compteur = 0
    4for i in range(len(nombres)):
    5    if nombres[i + 1] > nombres[i]:
    6        compteur += 1
    7print(compteur)
    

Exercice 18#

Complétez le programme ci-dessous afin que l'utilisateur puisse petit à petit créer une liste avec les codes postaux dans lesquels il souhaite se rendre. Cette liste des codes postaux ne doit jamais contenir de doublons ! Si l'utilisateur essaie d'en entrer un, le programme affichera Erreur, ce code postal est déjà dans la liste et continuera ensuite normalement. Le programme s'arrête quand l'utilisateur entre un code postal négatif. À ce moment, la liste des codes postaux est simplement affichée.

1# Complétez le programme
2codes_postaux = []
3code_postal = int(input("Entre un code postal: "))
4
5while code_postal >= 0:
6    # Complétez le programme à partir de là

Exercice 19#

La liste ci-dessous contient toutes les notes d'un bulletin. Avec cette liste, calculez les valeurs suivantes :

  1. Le nombre de bonnes notes (4.5 et plus).

  2. La moyenne. On calcule une moyenne en additionnant toutes les valeurs, puis en les divisant par leur nombre.

  3. La meilleure note obtenue.

 1notes = [3.6, 5.7, 3.6, 5.8, 2.2, 5.2, 2.4, 4.6, 2.8, 3.6, 3.8, 4.1]
 2
 3# Complétez le programme à partir de là
 4nb_bonnes_notes =
 5moyenne =
 6meilleure_note =
 7
 8print("Il y a", nb_bonnes_notes, "bonnes notes.")
 9print("La moyenne est de", moyenne)
10print("La meilleure note obtenue est", meilleure_note)

Exercice 20#

Écrivez un programme qui vérifie si une liste de nombres est triée dans l'ordre croissant, c'est-à-dire si chaque élément est plus petit ou égal à celui qui le suit. Le programme affichera La liste est triée ou La liste n'est pas triée. Testez-le avec les trois listes proposées.

1nombres = [2, 5, 5, 8, 13, 21]    # triée
2#nombres = [2, 5, 4, 8, 13, 21]   # pas triée
3#nombres = [21, 13, 8, 5, 2]      # pas triée
4
5#Écrivez votre code ici

Exercice 21#

Écrivez un programme qui crée une nouvelle liste inverse contenant les éléments de la liste podium dans l'ordre inverse, puis l'affiche. Utilisez une boucle for avec un range() qui parcourt les index en partant de la fin. Le programme doit afficher :

['Bronze', 'Argent', 'Or']
1podium = ["Or", "Argent", "Bronze"]
2inverse = []
3
4#Complétez le programme ici