Comment aplatir une liste de listes en Python

Apprenez à aplatir une liste de listes en Python. Comparez les compréhensions de listes imbriquées, itertools.chain, sum et les méthodes récursives avec des exemples de code.

Essayez cette solution dans l'éditeur

Aperçu

Lorsque vous travaillez avec des calculs matriciels, des lignes de base de données ou des arbres de données analysés, vous rencontrerez fréquemment des structures imbriquées, telles qu'une liste de listes : `[[1, 2], [3, 4]]`. Aplatir cette structure signifie la convertir en une liste unidimensionnelle contenant tous les éléments individuels : `[1, 2, 3, 4]`. Python propose plusieurs méthodes élégantes pour y parvenir.

La manière la plus courante et la plus pythonique d'aplatir une liste de listes consiste à utiliser une compréhension de liste imbriquée : `[élément de sous-liste dans la matrice pour élément de sous-liste]`. Bien que la syntaxe puisse sembler légèrement contre-intuitive au début car les boucles sont écrites dans le même ordre qu'une boucle « for » imbriquée, elle est hautement optimisée, rapide et ne nécessite pas l'importation de bibliothèques externes.

Alternativement, vous pouvez utiliser la fonction `chain.from_iterable()` du module `itertools`. Il s'agit de l'approche la plus efficace en termes de mémoire, car elle renvoie un itérateur qui génère des éléments paresseusement plutôt que d'allouer immédiatement une nouvelle liste en mémoire. Pour les listes profondément imbriquées (avec une profondeur arbitraire), vous devez écrire une fonction génératrice récursive pour décompresser tous les niveaux.

Sortie de code et d'exécution

Ce script montre l'aplatissement d'une liste de listes à l'aide de compréhensions de liste, d'itertools.chain et de décompression récursive.

import itertools

matrix = [[1, 2, 3], [4, 5], [6, 7, 8]]

# Method 1: List comprehension (Pythonic and fast)
flat_comp = [item for sublist in matrix for item in sublist]
print("List comprehension:", flat_comp)

# Method 2: itertools.chain (Highly memory efficient)
flat_chain = list(itertools.chain.from_iterable(matrix))
print("itertools.chain:", flat_chain)

# Method 3: Recursive function for deep/irregular nesting
irregular = [1, [2, 3], [[4, 5], 6]]

def flatten_deep(items):
    result = []
    for item in items:
        if isinstance(item, list):
            result.extend(flatten_deep(item))
        else:
            result.append(item)
    return result

print("Deep flatten:", flatten_deep(irregular))
Sortie terminale
List comprehension: [1, 2, 3, 4, 5, 6, 7, 8]
itertools.chain: [1, 2, 3, 4, 5, 6, 7, 8]
Deep flatten: [1, 2, 3, 4, 5, 6]

Mise en œuvre étape par étape

  • Utilisez une compréhension de liste imbriquée [élément pour la sous-liste dans la liste_imbriquée pour l'élément dans la sous-liste] pour les structures 2D plates.
  • Importez itertools et appelez itertools.chain.from_iterable(nested_list) pour une évaluation paresseuse et respectueuse de la mémoire.
  • Définissez une fonction récursive vérifiant isinstance(item, list) pour gérer les collections arbitrairement imbriquées.

Foire aux questions

Puis-je utiliser la fonction sum() pour aplatir les listes ?

Oui, sum(matrix, []) fonctionnera, mais c'est fortement déconseillé. Il s'exécute avec une complexité O(N^2) car il crée une nouvelle copie de liste à chaque ajout, ce qui entraîne des performances épouvantables pour les grands ensembles de données.

Quelle est la méthode la plus rapide pour aplatir des listes de listes ?

itertools.chain.from_iterable() est généralement le plus rapide, suivi de près par les compréhensions de listes imbriquées.

Sujets connexes

Ressources Python recommandées

Développez vos connaissances avec des didacticiels interactifs, des aide-mémoire et des comparaisons de codes associés.