logo

Aplanar la llista en Python

Una introducció

A Llista es considera una de les estructures de dades més flexibles del llenguatge de programació Python. D'altra banda, una llista bidimensional, o llista 2D, que generalment s'anomena llista de llistes, és un objecte d'una llista on cada element és una llista en si. Per exemple: [[19, 18, 17], [16, 15, 14], [13, 12, 11]].

Aplanar una llista de llistes és un procés de transformació d'una llista bidimensional en una llista unidimensional mitjançant l'anul·lació de tots els elements de la llista que es mantenen a la llista de llistes, és a dir, transformant [[9, 8, 7], [6] , 5, 4], [3, 2, 1]] a [9, 8, 7, 6, 5, 4, 3, 2, 1].

Podem realitzar el procés d'aplanament amb l'ajuda de l'imbricat per bucles, recursivitat, comprensió de llistes, funcions bàsiques o importació de biblioteques o paquets a Python sobre la profunditat i regularitat de les llistes imbricades.

En aquest tutorial, treballarem diversos mètodes per aplanar les llistes imbricades mitjançant el llenguatge de programació Python. Però abans de començar, anem a entendre els tipus de llistes imbricades.

Quins són els tipus de llistes imbricades?

Com sabem, Python és un llenguatge de programació poc escrit. Per tant, podem trobar dos tipus de llista de llistes. Aquestes llistes de llistes o llistes imbricades són les següents:

  1. Llista regular de llistes
  2. Llista irregular de llistes

Llista regular de llistes

Cada element de la llista regular de llistes es coneix com a subllista, observant així la uniformitat del tipus d'element. Per exemple: [[9, 8, 7], [6, 5, 4], [3, 2, 1]] és una llista normal de llistes com [9, 8, 7], [6, 5, 4] , [3, 2, 1] és del tipus llista.

Llista irregular de llistes

punt java

Cada element de la llista irregular de llistes es coneix com a subllista o com a element no llista (per exemple, una cadena o un nombre enter). Així, hi ha una irregularitat pel que fa al tipus d'element. Per exemple: [[9, 8, 7], [6, 5], 4, 3] és una llista irregular de llistes ja que [9, 8, 7] i [6, 5] són dels tipus de llista, mentre que 4 i 3 són del tipus int.

Aplanament de la llista de llistes utilitzant els bucles for nius

Aplanament de la llista de llistes amb l'imbricat per L'ajuda de Loops es considera un enfocament de força bruta per obtenir una llista plana. Podem realitzar aquest mètode seleccionant cada element de la llista bidimensional i organitzant-lo en una llista unidimensional.

Considerem l'exemple següent que funciona tant per a llistes de llistes regulars com irregulars.

Exemple:

 # defining the function def flattenlist(_2dlist): # defining an empty list flatlist = [] # Iterating through the outer list for item in _2dlist: if type(item) is list: # If the item is of the list type, iterating through the sub-list for element in item: flatlist.append(element) else: flatlist.append(item) return flatlist # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] print('Genuine List:', nestedlist) print('Converted Flat List:', flattenlist(nestedlist)) 

Sortida:

 Genuine List: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] Converted Flat List: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

Explicació:

A l'exemple anterior, hem definit una funció com aplanar llista que pren un paràmetre com _2dlist . Després hem utilitzat per bucle per repetir els elements de la llista imbricada i afegir-los per generar una llista aplanada. Aleshores hem definit la llista imbricada i implementem el aplanar llista funció. Com a resultat, la llista imbricada s'ha transformat correctament en la llista aplanada.

Aplanament de la llista imbricada mitjançant una comprensió de llista

Aplanar la llista de llistes amb l'ajuda d'una llista de comprensió es considera un enfocament elegant per obtenir una llista plana en funció d'una llista bidimensional existent. Tanmateix, aquest enfocament ofereix una solució menys intuïtiva.

Considerem l'exemple següent.

Exemple:

 # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # list comprehension flatlist = [element for sub_list in nestedlist for element in sub_list] print('Genuine list:', nestedlist) print('Converted list:', flatlist) 

Sortida:

 Genuine list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90] 

Explicació:

A l'exemple anterior, hem definit una llista imbricada i una comprensió de llista. Després els hem imprès per als usuaris. Com a resultat, la llista imbricada s'ha transformat correctament en la llista aplanada.

Aplanament de la llista de llistes mitjançant el mètode recursiu

També podem utilitzar el mètode recursiu per aplanar la llista bidimensional. Considerem l'exemple següent que implementa el mètode recursiu per tal d'aplanar la llista de llistes. Aquesta implementació funciona bé per a llistes regulars i irregulars.

Exemple:

 # defining a function def flattenlist(nestedlist): if len(nestedlist) == 0: return nestedlist if isinstance(nestedlist[0], list): return flattenlist(nestedlist[0]) + flattenlist(nestedlist[1:]) return nestedlist[:1] + flattenlist(nestedlist[1:]) print(flattenlist([[10, 20, 30, 40], [50, 60, 70], [80, 90], 100])) 

Sortida:

 [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

Explicació:

A l'exemple anterior, hem definit una funció i hem utilitzat un si declaració indicant si la longitud de la llista imbricada és igual a zero, després retorna la llista imbricada.

string.format java

Si l'element de dades de l'índex zero és una instància d'una llista, l'índex de la llista torna a entrar a la funció i s'afegeix a l'índex següent de la llista i així successivament. En cas contrari, la funció retornarà els elements i així successivament. Finalment, hem definit la llista imbricada i hem executat la funció. Com a resultat, la llista de llistes s'ha aplanat de manera recursiva.

Utilització de biblioteques de Python

També podem utilitzar algunes de les biblioteques del llenguatge de programació Python per aplanar la llista de llistes. A continuació es descriu la implementació d'aquestes biblioteques:

Aplanar la llista de llistes utilitzant les functools i les biblioteques d'operadors

El operador biblioteca ofereix el iconcat() funció per realitzar l'operació fonamental com la concatenació. Podem aplicar aquesta funció de manera acumulativa als elements de dades d'una llista imbricada, d'esquerra a dreta, el que resulta en la reducció de la llista imbricada a una llista aplanada.

Considerem l'exemple següent per entendre la seva implementació.

Exemple:

 # importing the required libraries import operator import functools regularlist = [] # Converting the list of lists into a flattened one. def convo(nestedlist): for element in nestedlist: if type(element) is list: regularlist.append(element) else: regularlist.append([element]) return regularlist twoDlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100], 110] regular2Dlist = convo(twoDlist) print('Given List:', twoDlist) print('Converted list:', functools.reduce(operator.iconcat, regular2Dlist, [])) 

Sortida:

 Given List: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100], 110] Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] 

Explicació:

A l'exemple anterior, hem importat el fitxer functools biblioteca juntament amb el operador biblioteca. Aleshores hem definit una llista buida com a llista regular . Aleshores hem definit una funció com convo per transformar la llista de llistes en una llista aplanada. En aquesta funció, hem utilitzat el per bucle on els elements de la llista imbricada s'afegeixen a la llista buida que hem definit anteriorment. Més endavant hem definit la llista imbricada i executem la funció. Com a resultat, la llista de llistes es converteix correctament en una llista aplanada.

Aplanament de la llista de llistes mitjançant la biblioteca itertools

El itertools biblioteca ofereix el cadena () funció que ens permet transformar idealment una llista imbricada en una única llista aplanada. Aquesta funció tracta les sèries consecutives com una única sèrie iterant-les mitjançant l'iterable passat com a paràmetre de manera sèrie.

Considerem l'exemple següent:

Exemple:

 # importing the itertools library import itertools # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] flattenlist = list(itertools.chain(*nestedlist)) print('The nested list:', nestedlist) print('The flattened list:', flattenlist 

Sortida:

 The nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] The flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

Explicació:

A l'exemple anterior, hem importat el fitxer itertools biblioteca i va generar una llista imbricada. Després hem utilitzat el cadena () funció per convertir la llista imbricada donada a la llista aplanada. Finalment, hem retornat el resultat als usuaris. Com a resultat, la llista de llistes s'aplana correctament.

Aplanament de la llista de llistes mitjançant la biblioteca NumPy

El NumPy La biblioteca ofereix diverses operacions quotidianes, inclosa la concatenació de matrius regulars bidimensionals per columnes o files. Utilitzarem l'atribut conegut com plana per tal d'aconseguir un iterador unidimensional sobre la matriu per conquerir l'objectiu. Considerem l'exemple següent per entendre l'ús de la funció de concatenació i l'atribut flat.

Exemple:

 # importing the library import numpy # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # using the concatenate function along with the flat attribute flattenlist = list(numpy.concatenate(nestedlist).flat) print('The Nested list:', nestedlist) print('The Flattened list:', flattenlist) 

Sortida:

 The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90] 

Explicació:

A l'exemple anterior, hem importat el fitxer numpy biblioteca i va definir una llista imbricada. Després hem utilitzat el concatenar funció de la numpy biblioteca juntament amb la seva plana atribut per aplanar els elements de la llista imbricada i concatenar-los a una nova llista aplanada. Finalment, hem imprès el resultat per als usuaris. Així, la llista de llistes s'aplana amb èxit.

subcadena en java

Utilització de les funcions bàsiques

També podem realitzar la tasca d'aplanament utilitzant algunes funcions bàsiques que proporciona el llenguatge de programació Python.

Aplanament de la llista de llistes mitjançant la funció suma

Podem considerar la suma de llistes internes com una altra solució al problema. Passem dos arguments al suma funció: el primer paràmetre és iterable , que és una llista imbricada, i el segon paràmetre ho és començar que és una llista buida per al cas següent que serveix com a llista plana inicial on s'afegiran els elements de dades de les subllistes interiors.

Podem dir que aquest enfocament és força convenient ja que no hem d'importar res. No obstant això, és més lent que el itertools() i cadena () funciona quan hi ha un gran nombre de subllistes presents a la llista imbricada.

Considerem l'exemple següent:

Exemple:

 # defining a nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # using the sum function flattenlist = sum(nestedlist, []) print('The Nested list:', nestedlist) print('The Flattened list:', flattenlist) 

Sortida:

 The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90] 

Explicació:

A l'exemple anterior, hem definit la llista imbricada. Després hem utilitzat el suma() i va aplanar la llista imbricada en una llista unidimensional i va imprimir la llista resultant per als usuaris. Com a resultat, hem transformat la llista de llistes en una llista plana amb èxit.

Aplanament de la llista de llistes mitjançant la paraula clau Lambda

Podem definir una funció anònima mitjançant la paraula clau lambda . Podem passar la llista regular/irregular com a paràmetre a aquesta funció anònima. L'avaluació de l'expressió es fa per tal d'obtenir una llista plana unidimensional.

Considerem l'exemple següent:

Exemple:

 # Defining the nested list nestedlist = [[10, 20, 30], [30, 50, 60], [40, 60, 70], 70] # Using lambda parameters: expression flattenlist = lambda nestedlist:[item for element in nestedlist for item in flattenlist(element)] if type(nestedlist) is list else [nestedlist] print('The Nested list:', nestedlist) print('The Flattened List:', flattenlist(nestedlist)) 

Sortida:

1 milió quants 0
 The Nested list: [[10, 20, 30], [30, 50, 60], [40, 60, 70], 70] The Flattened List: [10, 20, 30, 30, 50, 60, 40, 60, 70, 70] 

Explicació:

A l'exemple anterior, hem definit una llista imbricada. Després hem utilitzat el lambda paraula clau juntament amb un argument que defineix una expressió per a la comprensió de la llista. Després els hem imprès per als usuaris. Com a resultat, hem convertit correctament la llista irregular bidimensional en la llista aplanada.