Accueil

Listes

Objectifs du TD : étudier la structure de données élémentaire des listes

Nous avons vu qu'il est important de réfléchir à la bonne organisation des séquences d'instructions en utilisant correctement les conditionnelles, les itérations et les fonctions. Cela répond à la question : quel traitement effectuer ?
Mais il est aussi primordial de réfléchir à la façon de stocker les données qui sont manipulées par le programme. Dans ce chapitre, nous allons voir une structure de données très largement utilisée : les listes.

EXERCICES DE COURS

Définition

Comme les chaînes de caractères, les listes sont des séquences, c'est à dire des collections d'objets ordonnés. Les objets placés dans une liste sont accessibles via un indice qui indique la place de l'objet dans la séquence, en utilisant la notation [i]. Les listes sont délimitées par des crochets [], les éléments sont séparés par des ,. Une liste peut contenir des objets de types différents.

Exemples

# exemples simples sur les listes

# une liste de chaines de caractères
animaux = ["lion","loup","chat"]
# affiche loup
print(animaux[1]) 

# une liste avec des objets différents
listeMelangee = ["unMot",34,1.2,"unAutreMot"]
# affiche 35.2 (somme de 34 et 1.2)
print(listeMelangee[1]+listeMelangee[2])

# on peut modifier les éléments d'une liste
animaux[0] = "poule"
# affiche ['poule', 'loup', 'chat']
print(animaux)

# une liste de listes
matrice = [[1,2,3],[4,5,6],[7,8,9]]
# affiche [7, 8, 9]
print(matrice[2])
# affiche 7 (l'élément à l'indice 0 dans la liste à l'indice 2 de matrice
print(matrice[2][0])
# affiche 3 (l'élément à l'indice 2 dans la liste à l'indice 0 de matrice
print(matrice[0][2])

Principales fonctions sur les listes

Voici les principales fonctions sur les listes.

# les fonctions sur les listes

animaux = ["lion","loup","chat","poule","python"]

########################################################################
# fonctions élémentaires
########################################################################

# la longueur
print(len(animaux)) # affiche 5

# accès à une tranche d'éléments consécutifs
# l[i:j] renvoie la liste des éléments d'indices i à j-1
animaux1 = animaux[1:3]
animaux2 = animaux[:3]
animaux3 = animaux[2:]
# affiche ['loup', 'chat'];['lion', 'loup', 'chat'];['chat', 'poule', 'python']
print(animaux1,animaux2,animaux3,sep=';')

# concaténation de deux listes
print(animaux1+animaux2) # affiche ['loup', 'chat', 'lion', 'loup', 'chat']

########################################################################
# fonctions avec la notation .
# les listes sont des objets, auxquels on applique des "méthodes" (vu en CIP2)
########################################################################

# suppression
animaux.remove("lion")
print(animaux) # affiche ['loup', 'chat', 'poule', 'python']

# ajout d'un élément à la fin
animaux.append("truie")
print(animaux) # affiche ['loup', 'chat', 'poule', 'python', 'truie']

# insertion d'un élément
animaux.insert(2,"tigre")
print(animaux) # affiche ['loup', 'chat', 'tigre', 'poule', 'python', 'truie']


# recherche d'un élément
print(animaux.index("python")) # affiche 4
# print(animaux.index("tortue")) # provoque une erreur

# pour trier une liste
animaux.sort()
print(animaux) # affiche ['chat', 'loup', 'poule', 'python', 'truie']


Exercices

  1. Soit la liste suivante : l = ["fraise","kiwi",[12,34,56],5.34,"bonjour"]. Utiliser les fonctions de base sur les listes pour obtenir successivement les résultats suivants (tester vos réponses dans l'interprète Python) :


Comme les listes peuvent contenir n'importe quel type de données, il n'existe pas de fonction prédéfinie pour lire des listes au clavier. Dans les exercices suivants, vous pourrez utiliser le module lireListe qui permet de lire des listes d'entiers, des listes de caractères ou des listes de flottants qui sont entrés au clavier en étant séparés par des espaces.
  1. Ecrire une fonction qui calcule la moyenne d'une liste d'entiers. Tester cette fonction dans un programme qui lit la liste avec le module "lireListe" ci-dessus. Aide : on peut utiliser l'itérateur for sur les listes comme on l'a fait avec les chaînes de caractères.

  2. Ecrire une fonction qui prend une liste de notes N et une liste de coefficients C et qui calcule la moyenne pondérée (C0*N0+C1*N1+...+Cn*Nn)/(C0+C1+...+CN). Tester cette fonction dans un programme qui demande des notes et des coefficients tant que l'utilisateur ne tape pas "n" (pour non).
    calcul d'une moyenne pondérée
    donner les notes et les coefficients dans le même ordre
    les notes: 12 14 12
    les coefficients: 1 1 1
    la moyenne pondérée est 12.666666666666666
    encore ? o
    
    calcul d'une moyenne pondérée
    donner les notes et les coefficients dans le même ordre
    les notes: 12 14 11
    les coefficients: 3 5 2
    la moyenne pondérée est 12.8
    encore ? n
    
    Nota: rien ne vous empêche d'utiliser ce programme pour calculer votre moyenne en PeiP1 ...

  3. Ecrire un programme qui affiche plusieurs polygones qui sont décrits dans une liste : chaque élément de la liste est lui-meme une liste à 4 éléments : # le nombre de cotés, la taille du coté le x et le y de placement. Tester votre programme avec la liste [[3,150,0,0],[6,50,-100,-100],[8,50,100,100]] qui représente un triangle de coté 150 placé en (0,0), un hexagone de coté 50 placé en (-100,-100) et un octogone de coté 50 placé en (100,100).

  4. Ecrire une fonction qui insère un entier à la bonne place dans une liste d'entiers triés par ordre croissant. Aide: si la liste est vide, il suffit d'ajouter l'élément. Si l'élément est plus petit que le premier élément de la liste, il suffit de l'ajouter au début de la liste. Si l'élément est plus grand que le premier élément de la liste, il faut avancer dans la liste pour trouver la bonne place. Tous ces cas peuvent se résumer en un seul : "avancer tant qu'on n'a pas atteint la fin de la liste et que l'élément est trop grand".
    une liste: 
    un entier: 3
    après insertion [3]
     
    une liste: 4 6 9
    un entier: 3
    après insertion [3, 4, 6, 9]
    
    une liste: 1 2 4 6 8
    un entier: 3
    après insertion [1, 2, 3, 4, 6, 8]
    

  5. Ecrire une fonction qui lit deux listes d'entiers triés par ordre croissant et qui renvoie la fusion des deux listes. Par exemple, si la première liste est [12,34,678,890,932] et la deuxième liste est [1,2,3,35,67,890,900,1234] le résultat est [1,2,3,12,34,35,67,678,890,900,932,1234]. Aide: vous pouvez raisonner de la même façon que dans l'exercice précédent (e.g. si une des liste est vide, si le premier élément de la première liste est plus grand que le premier élément de la seconde liste, ...)

  6. On suppose que les résultats en "algorithmique et programmation" sont stockés dans une liste où chaque élément de la liste représente un élève et sa note. On suppose que chaque élève est lui-même représenté par une liste contenant 3 informations : le nom de l'élève, le prénom de l'élève, et la note obtenue. Voici un exemple d'un telle liste:
    [["Collavizza","Hélène",6],["Allais","Alphonse",14],["Reed","Lou",12]]
    
    On vous demande d'écrire un programme qui permet d'afficher les élèves et leurs notes, de calculer la moyenne de la classe et d'afficher le major de la promotion. Conseil: Vous devez écrire une fonction ou procédure pour chaque action possible. Exemple d'exécution :
    Voulez-vous :
       1. afficher les élèves
       2. calculer la moyenne de la classe
       3. trouver le major de promo
       4. sortir
    votre choix : 3
    
    Le major de promo est Alphonse Allais
    
    Voulez-vous :
       1. afficher les élèves
       2. calculer la moyenne de la classe
       3. trouver le major de promo
       4. sortir
    votre choix : 2
    
    La moyenne de la classe est 10.666666