Python >> Tutoriel Python >  >> Python

Aplatir une liste de listes en Python

Résumé : Aplatir une liste signifie convertir une liste imbriquée en une simple liste unidimensionnelle. Pour aplatir une liste imbriquée, nous pouvons utiliser la boucle for ou la boucle While ou la récursivité ou la méthode deepflatten() . D'autres techniques incluent l'importation de nombreuses bibliothèques Python externes et en utilisant leurs fonctions intégrées.

Aperçu

Problème : Étant donné une liste de listes en Python ; comment aplatir la liste ?

Maintenant, certains d'entre vous pourraient se demander ce que signifie réellement aplatir une liste ? ?

Répondre :

Aplatir une liste est le processus utilisé pour convertir une liste multidimensionnelle ou imbriquée (liste de listes) en une liste unidimensionnelle. Examinons un exemple pour avoir une idée plus claire de l'aplatissement d'une liste.

Exemple :Considérez la liste donnée comme indiqué ci-dessous.

[[10,20],[30,40,50]]

Après avoir aplati la liste, elle ressemble à ceci :

[10,20,30,40,50]

Types d'aplatissement de liste

Aplatissement superficiel est le processus d'aplatissement des listes qui n'ont qu'une profondeur d'un niveau.

Exemple : Considérez la liste comme ci-dessous (elle représente une liste d'une profondeur d'un niveau)

li = [[100,200],[300,400]]

Liste aplatie (peu profonde) :

[100,200,300,400,500]

Aplatissement profond est le processus d'aplatissement des listes qui ont des profondeurs variables.

Exemple : Considérez la liste donnée ci-dessous (elle représente une liste de profondeur variable).

l = [ [100,150], [ [200 ] ], [ 300, 400 ] ]

Liste aplatie (profonde) :

[100,150,200,300,400]

Maintenant que nous savons ce que signifie l'aplatissement et ses types, comprenons comment nous pouvons aplatir les listes. Sans plus tarder, que les jeux commencent !

Méthode 1 :Utilisation de la boucle For

Une approche simple de l'aplatissement superficiel consiste à utiliser une boucle for imbriquée et à ajouter les valeurs de la liste imbriquée une par une. Voyons comment cela peut être fait dans un programme.

li = [[10,20],[30,40]]
flat_li = []
for i in li:
  for item in i:
    flat_li.append(item)
print("list before flattening", li)
print ("flattened list: ",flat_li)

Sortie :

list before flattening [[10, 20], [30, 40]]
flattened list: [10, 20, 30, 40]

Méthode 2 :Utilisation d'une liste compréhensive

La méthode ci-dessus peut être emballée sur une seule ligne à l'aide d'une compréhension de liste. C'est un moyen très concis et efficace d'aplatir les listes en Python.

◆ La compréhension de liste est une manière compacte de créer des listes. La formule simple est [expression + context] . Pour une explication plus détaillée, veuillez suivre notre tutoriel de blog ici.

Le programme suivant utilise une compréhension de liste pour dériver une solution en une ligne pour aplatir les listes en Python.

li = [[10,20],[30,40]]
print("list before flattening", li)
print ("list after flattening",[item for i in li for item in i])

Sortie

list before flattening [[10, 20], [30, 40]]
list after flattening [10, 20, 30, 40]

Méthode 3 :Utilisation de itertools.chain()

chain() est une méthode dans le itertools  module qui accepte une série d'itérables, puis renvoie un seul itérable. La sortie générée qui est un itérable unique ne peut pas être utilisée directement et doit être explicitement convertie. Cette méthode nous permet d'éviter de créer des listes supplémentaires.

Pour aplatir une liste de listes, nous pouvons utiliser le itertools.chain() méthode et décompressez la liste donnée en utilisant le * opérateur.

Exemple :

import itertools
li = [ [100,150], [ [200 ] ], [ 300, 400 ] ]
print("list before flattening", li)
flat_li = list(itertools.chain(*li))
print("list after flattening", flat_li)

Sortie :

list before flattening [[100, 150], [[200]], [300, 400]]
list after flattening [100, 150, [200], 300, 400]

Remarque : Si vous ne souhaitez pas utiliser le * opérateur pour déballer la liste, vous pouvez utiliser le itertools.chain.from_iterable()

import itertools
li = [ [100,150], [ [200 ] ], [ 300, 400 ] ]
print("list li before flattening", li)
flat_li = list((itertools.chain.from_iterable(li)))
print("list li after flattening", flat_li)

Sortie :

list li before flattening [[100, 150], [[200]], [300, 400]]
list li after flattening [100, 150, 200, 300, 400]

Méthode 4 :Utilisation de flatten() Méthode

Nous pouvons aplatir les listes en utilisant le flatten() fonction du iteration_utilities module.

Syntaxe :

iteration_utilities.flatten(iterable)

Exemple :

from iteration_utilities import flatten
li = [[100, 150], [[200]], [300, 400]]
print(list(flatten(li)))

Sortie :

[100, 150, [200], 300, 400]

Cela ne résout notre objectif que dans une certaine mesure, car flatten() fonctionne à un niveau d'imbrication de liste. Cependant, nous voulons une solution qui ressemble à ceci :- [100, 150, 200, 300, 400]. Cela signifie que nous avons besoin d'un aplatissement profond complet de la liste donnée, ce qui nous amène à un aplatissement profond des listes.

Méthode 5 :Utilisation de deepflatten() Méthode

Afin d'obtenir un aplatissement en profondeur des listes imbriquées, nous avons besoin de l'aide d'un module intégré appelé deepflatten qui fait partie du iteration_utilities bibliothèque.

Remarque : Depuis iteration_utilities ne fait pas partie de la bibliothèque standard Python, vous devez l'installer explicitement à l'aide de la commande suivante :

pip install iteration-utilities

Examinons le programme suivant pour comprendre comment le deepflatten module, passe à plusieurs niveaux de profondeurs, puis aplatit la liste donnée.

from iteration_utilities import deepflatten
li = [ [100,150], [ [200 ] ], [ 300, 400 ] ]
print("list li before flattening", li)
flat_li = list(deepflatten(li))
print("list li after flattening", flat_li)
print("\n")
deep_li = [[0,1], [[2, [3, [4, [5, [6 ]]]]]], [7,8]]
print("list deep_li before flattening", li)
flat_li = list(deepflatten(li))
print("list deep_li after flattening", flat_li)

Sortie :

list li before flattening [[100, 150], [[200]], [300, 400]]
list li after flattening [100, 150, 200, 300, 400]

list deep_li before flattening [[100, 150], [[200]], [300, 400]]
list deep_li after flattening [100, 150, 200, 300, 400]

L'exemple ci-dessus illustre clairement l'efficacité du deepflatten la méthode est. J'ai mentionné quelques listes avec différentes profondeurs à dessein, afin que vous puissiez avoir une idée de l'utilité du deepflatten fonction. Vous n'avez même pas besoin d'autre fonction ou module si vous utilisez le deepflatten() fonction. Il est autosuffisant et peut aplatir la liste donnée par lui-même.

Méthode 6 :Utilisation de la boucle While

Une autre approche pour aplatir la liste donnée consiste à utiliser une boucle while pour faire apparaître tous les éléments de la liste donnée en fonction du type d'élément, puis l'ajouter à la nouvelle liste aplatie. Examinons le code ci-dessous pour comprendre comment cela fonctionne.

def flatten(l): 
    li = []
    while l: #iterate until provided list is empty.
            e = l.pop()
            if type(e) == list: #check type of the poped item.
                    l.extend(e) #if popped item is list then extend the item to given list.
            else:
                    li.append(e) #if popped item is not list then add it to li
    li.sort()
    return li


a = [[100, 150], [[200]], [300, 400]]
print("list before flattening: ", a)
print("list after flattening: ", flatten(a))

Sortie :

list before flattening:  [[100, 150], [[200]], [300, 400]]
list after flattening:  [100, 150, 200, 300, 400]

Méthode 7 :Utilisation de la récursivité

Si vous êtes d'accord avec la récursivité, vous voudrez peut-être jeter un œil à la façon d'aplatir les listes à l'aide de la récursivité. L'avantage de cette méthode est qu'elle ne nécessite aucune autre importation.

Examinons l'exemple suivant pour comprendre comment nous pouvons utiliser la récursivité pour aplatir les listes imbriquées.

li = [[100, 150], [[200]], [300, 400]]

def flatten(l):
    if len(l) == 1:
            if type(l[0]) == list:
                    result = flatten(l[0])   
            else:
                    result = l
    elif type(l[0]) == list:
            result = flatten(l[0]) + flatten(l[1:])
    else:
            result = [l[0]] + flatten(l[1:])
    return result

print(flatten(li))

Sortie :

[100, 150, 200, 300, 400]

 ? Aplatir des listes à l'aide de bibliothèques Python

Nous pouvons tirer parti de la puissance de différentes bibliothèques Python et utiliser les méthodes intégrées qu'elles contiennent pour aplatir les listes en Python. Passons rapidement en revue certaines d'entre elles dans cet article.

Pandas

from pandas.core.common import flatten

li = [[100, 150], [200], [300, 400]]

print("list before flattening: ", li)
print("list after flattening: ", list(flatten(li)))

Matplotlib

from matplotlib.cbook import flatten

li = [[100, 150], [200], [300, 400]]

print("list before flattening: ", li)
print("list after flattening: ", list(flatten(li)))

Unipath

import unipath
from unipath.path import flatten

li = [[100, 150], [200], [300, 400]]

print("list before flattening: ", li)
print("list after flattening: ", list(flatten(li)))

Outils de configuration

from setuptools.namespaces import flatten

li = [[100, 150], [200], [300, 400]]

print("list before flattening: ", li)
print("list after flattening: ", list(flatten(li)))

Functools

import functools
import operator

li = [[100, 150], [200], [300, 400]]

print("list before flattening: ", li)
print("list after flattening: ",(functools.reduce(operator.concat, li)))

Sortie :

La sortie dans le cas de tous les codes ci-dessus sera comme indiqué ci-dessous.

list before flattening:  [[100, 150], [[200]], [300, 400]]
list after flattening:  [100, 150, [200], 300, 400]

Conclusion

Nous avons appris ce qui suit dans cet article :

  • Qu'est-ce que l'aplatissement de liste et les types d'aplatissement de liste ?
  • Utilisation de la boucle for pour aplatir la liste.
  • Utiliser une compréhension de liste pour aplatir la liste.
  • Utiliser itertools.chain() pour aplatir la liste.
  • Utilisation de la méthode flatten pour aplatir la liste.
  • Utiliser la méthode deepflatten() pour aplatir la liste.
  • Utiliser une boucle While pour aplatir la liste.
  • Utiliser la récursivité pour aplatir la liste.
  • Aplatir les listes à l'aide des bibliothèques Python :
    • Pandas
    • Matpotlib
    • Unipath
    • Outils de configuration
    • Functools

J'espère que vous pourrez facilement aplatir les listes en utilisant les méthodes décrites dans cet article. Veuillez vous abonner et rester à l'écoute pour des articles plus intéressants.