Aller au contenu

Tableaux de tableaux en Python

Les tableaux, type abstrait de données (TAD), seront implémentés en python par des objet de type list.
Dans la suite du cours, on parlera indifféremment de tableau (TAD) ou de liste Python (type list).

Définition par extension

Le tableau :

A = 1 2 3
4 5 6
7 8 9

est représenté en Python par :

>>> A = [ [1,2,3],
          [4,5,6],
          [7,8,9] ]

Remarque

Observez que vous pouvez passer à la ligne après la virgule de séparation des éléments (ici les sous-tableaux) pour plus de visibilité.

Éléments et sous-éléments d'une matrice

Un tableau de tableaux est muable. Si on désigne par mat un tel tableau, alors :

  • on peut toujours accéder et modifier un des sous-tableaux d'indice i avec l'instruction mat[i] ;
  • on peut aussi accéder et modifier l'élément d'indice j du sous-tableau d'indice i avec l'instruction mat[i][j].

Exemple

Recopiez et testez dans la console les instructions ci-dessous. Vérifiez que la console renvoie bien les valeurs affichées :

>>> A = [ [1,2,3],
          [4,5,6],
          [7,8,9] ]

>>> A
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

>>> A[0]
[1, 2, 3]

>>> A[1]
[4, 5, 6]

>>> A[2]
[7, 8, 9]

>>> A[1] = [666, 69, 96]

>>> A
[[1, 2, 3], [666, 69, 96], [7, 8, 9]]

>>> A[0][1]
2

>>> A[0][1] = 42

>>> A
[[1, 42, 3], [666, 69, 96], [7, 8, 9]]

Définition élément par élément

Compléter à la main une matrice rempli de zéros est fastidieux. Une méthode possible (il y en a d'autres) consiste à le remplir à l'aide d'une double boucle for :

  • la première boucle for crée les lignes ;
  • la seconde boucle for insère les zéros dans une ligne.

Exemple

Complétez les pointillés de la définition de la fonction rempli_uns() qui renvoie une matrice dont tous les éléments sont des 1.
Cette matrice comporte nb_lignes lignes et nb_colonnes colonnes, où nb_lignes et nb_colonnes sont des entiers strictement positifs passés en paramètres de la fonction.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
def rempli_uns(nb_lignes, nb_colonnes):
    """
    nb_lignes, nb_colonnes - int, entiers strictement positifs
    Sortie: list - matrice contenant nb_lignes lignes, chacune
            contenant nb_colonnes dont tous les éléments valent 1
    """
    matrice = []

    for ... :
        ligne = []
        for ... :
            ...
        matrice.append(...)

    return ...

Voici un exemple de test :

>>> mat = rempli_uns(5, 3)
>>> for ligne in mat:
...     print(ligne)

[1, 1, 1]
[1, 1, 1]
[1, 1, 1]
[1, 1, 1]
[1, 1, 1]

Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
def rempli_uns(nb_lignes, nb_colonnes):
    """
    nb_lignes, nb_colonnes - int, entiers strictement positifs
    Sortie: list - matrice contenant nb_lignes lignes, chacune
            contenant nb_colonnes dont tous les éléments valent 1
    """
    matrice = []

    for num_ligne in range(nb_lignes) :
        ligne = []
        for num_colonne in range(nb_colonnes) :
            ligne.append(1)
        matrice.append(ligne)

    return matrice

Définition par compréhension

Une matrice peut aussi être définie par compréhension.

Testez les instructions suivantes dans la console et essayez de les comprendre (car il faudra savoir les formuler ainsi) :

>>> Un = [ [1 for num_colonne in range(3)] for num_ligne in range(5) ]

>>> Un
[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]

>>> Descend = [ [j-i for i in range(3)] for j in range(3, 0, -1) ]

>>> Descend
[[3, 2, 1], [2, 1, 0], [1, 0, -1]]

>>> A = [ [i+3*j for i in range(1, 4)] for j in range(3) ]

>>> A
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Remarque

On peut constater que la définition de la matrice Un :

Un = [ [1 for num_colonne in range(3)] for num_ligne in range(5) ]
est bien plus pratique par compréhension qu'en utilisant la fonction rempli_uns() définie dans le paragraphe précédent :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
def rempli_uns(nb_lignes, nb_colonnes):
    """
    nb_lignes, nb_colonnes - int, entiers strictement positifs
    Sortie: list - matrice contenant nb_lignes lignes, chacune
            contenant nb_colonnes dont tous les éléments valent 1
    """
    matrice = []

    for num_ligne in range(nb_lignes) :
        ligne = []
        for num_colonne in range(nb_colonnes) :
            ligne.append(1)
        matrice.append(ligne)

    return matrice