Aller au contenu principal
Première

Algorithmique et programmation : les listes en Python — Exercices d'application

1. Créer une liste et accéder à ses éléments

↩ Revoir le cours

Exercice 1 — ⭐

On définit L = [3, 8, 1, 6, 4].

  1. Que valent L[1], L[-2] et len(L) ?
  2. Que se passe-t-il si on demande L[5] ?
  3. On exécute L[0] = L[4] + 1. Que contient L ensuite ?
Voir le corrigé
  1. L[1] vaut 8 (deuxième élément, l’indice commence à 0), L[-2] vaut 6 (avant-dernier), len(L) vaut 5.
  2. Une erreur IndexError : les indices vont de 0 à 4.
  3. L[4] + 1 = 5, donc L vaut [5, 8, 1, 6, 4].

2. Ajouter et supprimer des éléments

↩ Revoir le cours

Exercice 2 — ⭐

Donne le contenu de L après chaque ligne, puis ce qu’affiche le programme.

L = [2, 4]
L.append(6)
L.append(L[0] + L[-1])
L.pop(1)
L.remove(8)
print(L)
Voir le corrigé

[2, 4] → [2, 4, 6] → [2, 4, 6, 8] (car L[0] + L[-1] = 2 + 6) → [2, 6, 8] (on retire l’élément d’indice 1, le 4) → [2, 6]. Le programme affiche [2, 6].


3. Générer une liste

↩ Revoir le cours

Exercice 3 — ⭐⭐

  1. Écris en compréhension la liste des multiples de 77 compris entre 77 et 4949.
  2. Écris en compréhension la liste des cubes des entiers de 11 à 55.
  3. Que vaut [x - 1 for x in [3, 5, 9] if x > 4] ?
Voir le corrigé
  1. [7 * k for k in range(1, 8)], qui vaut [7, 14, 21, 28, 35, 42, 49].
  2. [k ** 3 for k in range(1, 6)], qui vaut [1, 8, 27, 64, 125].
  3. On garde 5 et 9 (supérieurs à 4) et on leur retire 1 : [4, 8].

Exercice 4 — ⭐⭐

La suite de Fibonacci est définie par F0=0F_0 = 0, F1=1F_1 = 1 et Fn+2=Fn+1+FnF_{n+2} = F_{n+1} + F_n.

  1. Calcule à la main F2F_2, …, F6F_6.
  2. Écris une fonction fibo(n) qui renvoie la liste des nn premiers termes [F0,F1,…,Fn−1][F_0, F_1, \dots, F_{n-1}] (pour n⩾2n \geqslant 2). On utilisera L[-1] et L[-2].
Voir le corrigé
  1. F2=1F_2 = 1, F3=2F_3 = 2, F4=3F_4 = 3, F5=5F_5 = 5, F6=8F_6 = 8.
  2. def fibo(n):
        L = [0, 1]
        for i in range(n - 2):
            L.append(L[-1] + L[-2])
        return L
    
    print(fibo(10))   # affiche [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

4. Parcourir une liste

↩ Revoir le cours

Exercice 5 — ⭐⭐⭐

Écris les fonctions suivantes sans utiliser sum, max ni count.

  1. compte(L, x) : renvoie le nombre de fois où x apparaît dans L.
  2. moyenne(L) : renvoie la moyenne des éléments de L.
  3. indice_max(L) : renvoie l’indice du plus grand élément (le premier, s’il y en a plusieurs).
Voir le corrigé
def compte(L, x):
    c = 0
    for y in L:
        if y == x:
            c = c + 1
    return c

def moyenne(L):
    s = 0
    for y in L:
        s = s + y
    return s / len(L)

def indice_max(L):
    im = 0
    for i in range(len(L)):
        if L[i] > L[im]:
            im = i
    return im

print(compte([1, 3, 1, 2], 1), moyenne([4, 8, 9]), indice_max([5, 9, 2, 9]))   # affiche 2 7.0 1

Pour indice_max, on a besoin de la position : on parcourt donc par les indices.


Exercice 6 — ⭐⭐⭐

Un professeur range les notes d’un contrôle dans une liste : notes = [8, 12, 15, 9, 11, 14].

  1. Écris en compréhension la liste admis des notes supérieures ou égales à 1010. Que vaut-elle ?
  2. Écris une instruction qui calcule la proportion de notes supérieures ou égales à 1010.
Voir le corrigé
  1. admis = [n for n in notes if n >= 10], qui vaut [12, 15, 11, 14].
  2. len(admis) / len(notes), qui vaut 46=23≈0,67\dfrac46 = \dfrac23 \approx 0{,}67.

5. Les listes au service des mathématiques

↩ Revoir le cours

Exercice 7 — ⭐⭐⭐

  1. Explique ce que renvoie la fonction suivante, puis donne diviseurs(36).
    def diviseurs(n):
        return [d for d in range(1, n + 1) if n % d == 0]
  2. Un nombre est parfait s’il est égal à la somme de ses diviseurs autres que lui-même (exemple : 6=1+2+36 = 1 + 2 + 3). Écris une fonction est_parfait(n) qui renvoie True ou False, puis une instruction qui donne la liste des nombres parfaits inférieurs à 500500.
Voir le corrigé
  1. La liste des diviseurs positifs de nn (les dd entre 11 et nn tels que le reste de nn par dd est nul). diviseurs(36) vaut [1, 2, 3, 4, 6, 9, 12, 18, 36].
  2. def est_parfait(n):
        return sum(diviseurs(n)) - n == n
    
    print([n for n in range(2, 500) if est_parfait(n)])   # affiche [6, 28, 496]

Exercice 8 — ⭐⭐⭐⭐

On lance deux dés et on note la somme SS (de 22 à 1212).

  1. Écris une fonction effectifs_sommes(n) qui simule nn lancers de deux dés et renvoie une liste de 1111 effectifs : à l’indice 00 l’effectif de la somme 22, …, à l’indice 1010 celui de la somme 1212.
  2. Quelle fréquence attend-on, pour nn grand, à l’indice 55 ? Justifie.
Voir le corrigé
  1. from random import randint
    
    def effectifs_sommes(n):
        E = [0] * 11            # liste de 11 zéros
        for k in range(n):
            s = randint(1, 6) + randint(1, 6)
            E[s - 2] = E[s - 2] + 1
        return E
    ([0] * 11 fabrique une liste de onze zéros ; on pouvait aussi écrire [0 for i in range(11)].)
  2. L’indice 55 correspond à la somme 77. Sur les 3636 couples équiprobables, 66 donnent 77 : (1,6),(2,5),…,(6,1)(1,6), (2,5), \dots, (6,1). La fréquence doit se rapprocher de 636=16≈0,167\dfrac{6}{36} = \dfrac16 \approx 0{,}167 (la somme la plus fréquente).