IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Programmation Python pour les scientifiques

Listes et autres structures de données - Cours avec exercices corrigés


précédentsommairesuivant

VI. Corrigés des exercices

VI-A. Suite arithmétique : solution

À l'aide d'une boucle :

 
Sélectionnez
def suite1(n) : 
    result = [] 
    for i in range(n) : 
        result.append(12*i+1) 
    return result

En compréhension de liste :

 
Sélectionnez
def suite2(n) : 
    return [12*i+1 for i in range(n)]

Dans une console IPython :

 
Sélectionnez
%timeit(suite1(1000000))
1 loops, best of 3: 140 ms per loop

%timeit(suite2(1000000))
10 loops, best of 3: 93.4 ms per loop

La fonction avec la définition de la liste en compréhension est plus rapide.

VI-B. Moyenne et variance : solution

  • Calcul de la moyenne :
 
Sélectionnez
def moyenne(liste): 
    if (liste != []) :
        return float(sum(liste)) / len(liste)
 
Sélectionnez
>>> from random import random 
>>> L = [random() for i in range(100)] 
>>> moyenne(L) 
0.49407951863783545
  • Calcul de la variance, à l'aide de la définition kitxmlcodeinlinelatexdvpV(X)=E((X-E(X))^2finkitxmlcodeinlinelatexdvp
 
Sélectionnez
def variance(liste) : 
    if (liste != []) : 
        esp = moyenne(liste) 
        liste2 = [(x-esp)**2 for x in liste] 
        return moyenne(liste2)
  • Calcul de la variance, à l'aide de la formule de König-Huygens : kitxmlcodeinlinelatexdvpV(X)=E(X^2)-E(X)^2finkitxmlcodeinlinelatexdvp
 
Sélectionnez
def variance(liste) : 
    return moyenne([x**2 for x in liste]) - moyenne(x)**2

VI-C. Listes définies en compréhension : solution

  1. La liste des logarithmes népériens (ln) des entiers compris entre 1 et 20 :

     
    Sélectionnez
    >>> from math import log # import de log du module math 
    >>> liste1 = [log(n) for n in range(1,21)] 
    >>> print liste1 
    [0.0, 0.6931471805599453, 1.0986122886681098, 1.3862943611198906, 1.6094379124341003, 1.791759469228055, 1.9459101490553132, 2.0794415416798357, 2.1972245773362196, 2.302585092994046, 2.3978952727983707, 2.4849066497880004, 2.5649493574615367, 2.6390573296152584, 2.70805020110221, 2.772588722239781, 2.833213344056216, 2.8903717578961645, 2.9444389791664403, 2.995732273553991]
  2. La liste des entiers compris entre 0 et 100 qui sont pairs et qui ne sont pas des multiples de 3 :

     
    Sélectionnez
    >>> liste2 = [n for n in range(0,101) if (n % 2 == 0) and (n % 3 != 0)] 
    >>> print liste2 
    [2, 4, 8, 10, 14, 16, 20, 22, 26, 28, 32, 34, 38, 40, 44, 46, 50, 52, 56, 58, 62, 64, 68, 70, 74, 76, 80, 82, 86, 88, 92, 94, 98, 100]
  3. Une alternative plus rapide :

     
    Sélectionnez
    >>> liste2 = [n for n in range(0,101,2) if (n % 3 != 0)] 
    >>> print liste2 
    [2, 4, 8, 10, 14, 16, 20, 22, 26, 28, 32, 34, 38, 40, 44, 46, 50, 52, 56, 58, 62, 64, 68, 70, 74, 76, 80, 82, 86, 88, 92, 94, 98, 100]
  4. La liste ['@-@', '@--@', '@---@', '@----@', '@-----@'] :

     
    Sélectionnez
    >>> ['@' + '-' * n + '@' for n in range(1,6)] 
    ['@-@', '@--@', '@---@', '@----@', '@-----@']
  5. La liste des couples d'entiers entre 0 et 10 dont la somme est un multiple de 5 :

     
    Sélectionnez
    >>> [(i, j) for i in range(11) for j in range(11) if (i+j) % 5 == 0] 
    [(0, 0), (0, 5), (0, 10), (1, 4), (1, 9), (2, 3), (2, 8), (3, 2), (3, 7), (4, 1), (4, 6), (5, 0), (5, 5), (5, 10), (6, 4), (6, 9), (7, 3), (7, 8), (8, 2), (8, 7), (9, 1), (9, 6), (10, 0), (10, 5), (10, 10)]
  6. Écrire une fonction qui prend pour paramètre un entier n et retourne sous forme d'une liste de listes la matrice identité de rang n :
 
Sélectionnez
def IdMat(n): 
    return [[0 for j in range(k)]+[1]+[0 for j in range(n-1-k)] for k in range(n)]
 
Sélectionnez
>>> IdMat(2) 
[[1, 0], [0, 1]] 
>>> IdMat(3) 
[[1, 0, 0], [0, 1, 0], [0, 0, 1]] 
>>> IdMat(4) 
[[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]

VI-D. Chiffrement de César : solution

  • Fonction de chiffrement :
 
Sélectionnez
>>> def cesar_crypt(ch, n) : 
...     result = '' 
...     for i in range(len(ch)) : 
...         result += chr((ord(ch[i]) + n-ord('A')) % 26 + ord('A')) 
...     return result 
... 
>>> print cesar_crypt('BONJOUR',1) 
CPOKPVS
  • Fonction de déchiffrement :
 
Sélectionnez
>>> def cesar_decrypt(ch, n) : 
...     return cesar_crypt(ch, -n) 
... 
>>> cesar_decrypt('CPOKPVS',1) 
'BONJOUR'

VI-E. Triangle de Pascal : solution

 
Sélectionnez
def pascal_triangle(n) :
    result = []
    for i in range(n+1) :
        temp = []
        for k in range(i+1):
            if k == 0:
                temp.append(1)
            elif k == i:
                temp.append(1)
            else:
                temp.append(result[i-1][k-1] + result[i-1][k])
        result.append(temp)
    return result

Exemple d'utilisation :

 
Sélectionnez
>>> liste = pascal_triangle(6)
>>> for x in liste :
...     print x
...
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]

précédentsommairesuivant

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2014 Jean-Philippe PREAUX. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.