Comment aplatir une liste en Python

Aliaksei Yursha 25 juin 2020
  1. Aplatissement peu profond de la liste Python
  2. Aplatissement profond des listes Python
Comment aplatir une liste en Python

L’aplatissement est une opération qui consiste à prendre une liste de listes imbriquées et à la convertir en une structure de données différente qui ne contient pas de listes imbriquées.
Au lieu de cela, elle inclut tous les éléments de toutes les listes, qui ont été initialement imbriquées.
Une telle structure de données est appelée une liste plat ou aplatie.

La liste originale peut contenir des listes imbriquées dans le premier niveau d’imbrication seulement, pour
exemple [[1, 2], [3, 4]].
Sinon, il contient des listes sur les deuxième, troisième et autres niveaux de nidification,
par exemple [[[1], [2]], [3, 4]].
On dit qu’une telle liste contient des listes imbriquées deeply.

Si nous voulons désenchevêtrer un seul niveau d’imbrication, nous appelons cela un aplatissement faible.
Si nous voulons désencombrer tous les niveaux d’imbrication, nous appelons cela un aplatissement profond.

Aplatissement peu profond de la liste Python

Une approche simple pour comprendre et visualiser est d’utiliser une double boucle for.

La première boucle for traverse des listes imbriquées. La seconde boucle for itére sur les éléments de chaque liste imbriquée et les ajoute un par un à une liste plate résultante.

>>> flat_list = []
>>> original_list = [[1, 2], [3, 4]]
>>> for l in original_list:
...   for item in l:
...     flat_list.append(item)
...
>>> flat_list
[1, 2, 3, 4]

La méthode ci-dessus est claire et lisible, mais l’expressivité de Python permet
pour atteindre le même but en une seule ligne.
Ici, les listes de compréhension de Python viennent nous aider.

>>> original_list = [[1, 2], [3, 4]]
>>> flat_list = [item for l in original_list for item in l]
>>> flat_list
[1, 2, 3, 4]

Si vous n’avez pas besoin d’une liste plate en soi, mais que vous voulez être capable d’itérer sur tous les éléments
de toutes les sous-listes comme si elles provenaient d’une seule structure de données plate, vous pouvez utiliser itertools.chain().

>>> import itertools
>>> original_list = [[1, 2], [3, 4]] 
>>> iterator = itertools.chain(*original_list)
>>> for item in iterator:
...   print(item)
...
1
2
3
4

Si vous utilisez Pandas - un paquet open-source pour l’analyse de données en Python - il existe aussi un moyen intégré.

>>> from pandas.core.common import flatten
>>> original_list = [[1, 2], [3, 4]]  
>>> flat_list = list(flatten(original_list))
>>> flat_list
[1, 2, 3, 4]

Aplatissement profond des listes Python

Comme mentionné ci-dessus, l’aplatissement superficiel ne fonctionnera pas, si nous avons des listes profondément imbriquées.
Il ne insuffisera que le premier niveau d’imbrication, comme le montre l’exemple ci-dessous.

>>> deeply_nested_list = [[[1, 2], 3], [4, 5, 6]]
>>> flat_list = [item for l in deeply_nested_list for item in l]
>>> flat_list
[[1, 2], 3, 4, 5, 6]

Pour faire l’aplatissement profond, utilisez iteration_utilities.deepflatten() depuis le paquet PyPI iteration-utilities.

D’abord, installez le paquet PyPI lui-même.

$ pip install iteration-utilities

Ensuite, aplatissez vos listes profondément imbriquées.

>>> from iteration_utilities import deepflatten
>>> deeply_nested_list = [[[1, 2], 3], [4, 5, 6]]
>>> flat_list = list(deepflatten(deeply_nested_list))
>>> flat_list
[1, 2, 3, 4, 5, 6]

Article connexe - Python List