HOWTO · Python

Créer une liste de listes en Python

Ce tutoriel montre comment créer une liste contenant d'autres listes en Python

Sur cette page

Une liste Python peut contenir d’autres listes parmi ses éléments. Cette structure permet de regrouper des séquences liées, par exemple des lignes de valeurs, des groupes d’enregistrements ou des données imbriquées. Une liste imbriquée rectangulaire de nombres peut représenter une matrice, mais les listes imbriquées n’ont pas besoin d’être rectangulaires : chaque liste interne peut avoir une longueur différente.

Les exemples ci-dessous présentent trois façons de construire cette structure, puis montrent comment lire et modifier ses valeurs. Choisissez la méthode adaptée selon que vos listes internes existent déjà, que vous avez besoin d’une grille régulière ou que vous générez les valeurs étape par étape.

Ce que représente une liste de listes

Une liste externe stocke des références vers ses éléments. Lorsqu’un élément est lui-même une liste, la liste externe permet de regrouper ces listes internes. Par exemple, une liste d’élèves peut contenir une liste par classe, ou une grille numérique une liste par ligne.

Une liste imbriquée n’est pas automatiquement une matrice. Le terme « matrice » convient lorsque les lignes ont le même nombre de colonnes et que les valeurs forment un agencement rectangulaire. Python autorise des lignes de longueurs différentes. Cela peut être pratique pour regrouper des données, mais demande de la prudence lorsqu’on parcourt les colonnes.

Créer une liste de listes à partir de listes existantes

Si vous avez déjà des listes internes, placez-les dans un littéral de liste externe. Pour ajouter ensuite une autre liste existante, appelez la méthode de liste append() sur la liste externe. Elle ajoute son argument comme un seul élément à la fin ; elle ne fusionne pas les valeurs de cette liste dans la liste externe.

Exécutez cet exemple. Le code et les libellés ou sorties affichés restent en anglais :

first = ["Ada", "Grace"]
second = ["Linus", "Guido"]
people_by_group = [first, second]
third = ["Barbara", "Margaret"]
people_by_group.append(third)
print(people_by_group)

La liste externe contient trois listes internes. Comme les listes d’origine sont des objets modifiables, toute modification ultérieure de first est également visible dans people_by_group[0] : les deux noms font référence à la même liste.

Créer des lignes indépendantes avec une compréhension de liste imbriquée

Pour créer une grille de dimensions fixes, une compréhension de liste imbriquée génère chaque ligne séparément. La compréhension externe s’exécute une fois par ligne. Son expression est une compréhension interne qui crée les valeurs de cette ligne.

Exécutez cet exemple. Le code et les libellés ou sorties affichés restent en anglais :

rows, columns = 3, 4
grid = [[0 for _ in range(columns)] for _ in range(rows)]
print(grid)

À chaque passage de la compréhension externe, une nouvelle liste interne est créée ; les lignes peuvent donc être modifiées indépendamment. Utilisez cette méthode lorsque vous avez besoin d’une grille modifiable dont toutes les cellules reçoivent la même valeur initiale. Remplacez 0 par une autre valeur ou expression initiale au besoin.

Construire une liste de listes avec des boucles imbriquées

Les boucles imbriquées sont utiles lorsque chaque valeur dépend de sa ligne ou de sa colonne, ou lorsque vous souhaitez rendre explicites les étapes de construction. Commencez par une liste externe, créez une ligne à la fois, remplissez-la dans la boucle interne, puis ajoutez la ligne terminée.

Exécutez cet exemple. Le code et les libellés ou sorties affichés restent en anglais :

rows, columns = 3, 4
grid = []
for row_index in range(rows):
    row = []
    for column_index in range(columns):
        row.append(row_index * columns + column_index)
    grid.append(row)
print(grid)

Ici, chaque cellule reçoit une valeur calculée à partir de sa position. Appeler append() sur row ajoute une valeur ; l’appeler sur grid ajoute la ligne terminée. Cette méthode convient aussi lorsque le nombre de valeurs ou leur contenu est déterminé pendant l’itération.

Accéder aux éléments imbriqués et les modifier

Utilisez un indice pour la liste externe et un autre pour la liste interne sélectionnée : list_of_lists[row_index][column_index]. Les indices Python commencent à zéro ; la première valeur de la première ligne se trouve donc à [0][0]. Affectez une nouvelle valeur à cette même expression pour remplacer un élément.

Exécutez cet exemple. Le code et les libellés ou sorties affichés restent en anglais :

grid = [[2, 4, 6], [8, 10, 12]]
print(grid[1][0])
grid[0][2] = 7
print(grid)

Le premier indice sélectionne une ligne, et le second un élément de cette ligne. L’indice de ligne doit désigner une liste interne existante, et l’indice de colonne doit correspondre à un élément présent dans cette ligne. Si les lignes ont des longueurs différentes, vérifiez la longueur de la ligne choisie avant d’utiliser un indice de colonne : une colonne présente dans une ligne peut manquer dans une autre.

Choisir une méthode de construction et éviter les lignes partagées

Utilisez un littéral de liste lorsque les sous-listes sont déjà connues. Pour une grille régulière dont les lignes doivent être indépendantes, utilisez une compréhension de liste imbriquée. Préférez les boucles imbriquées lorsque les valeurs sont calculées étape par étape ou que la construction nécessite une logique supplémentaire. Ces méthodes créent une nouvelle liste interne pour chaque ligne.

Un raccourci tentant pour créer une grille est [[0] * columns] * rows. Il répète les références vers une seule liste interne au lieu de créer une liste distincte pour chaque ligne. Ainsi, modifier une cellule dans une ligne modifie aussi la valeur correspondante dans toutes les autres lignes. Pour une grille modifiable, utilisez la compréhension imbriquée présentée plus haut ou construisez chaque ligne séparément dans une boucle.

Les listes imbriquées peuvent aussi avoir des lignes de longueurs différentes si cela correspond aux données. Lorsque vous traitez une telle structure, parcourez les valeurs propres à chaque ligne au lieu de supposer que toutes les lignes ont le même nombre de colonnes. La construction et l’accès ultérieur restent ainsi adaptés à la forme des données.