logo

Aplatizați lista în Python

O introducere

A Listă este considerată una dintre cele mai flexibile structuri de date din limbajul de programare Python. Pe de altă parte, o listă bidimensională sau Listă 2D, care este denumită în general o listă de liste, este un obiect al unei liste în care fiecare element este o listă în sine. De exemplu: [[19, 18, 17], [16, 15, 14], [13, 12, 11]].

Aplatizarea unei liste de liste este un proces de transformare a unei liste bidimensionale într-o listă unidimensională prin anularea imbricatului fiecărui element de listă păstrat în lista de liste, adică transformând [[9, 8, 7], [6] , 5, 4], [3, 2, 1]] la [9, 8, 7, 6, 5, 4, 3, 2, 1].

Putem efectua procesul de aplatizare cu ajutorul imbricatului pentru bucle, recursivitate, liste de înțelegere, funcții de bază sau importarea bibliotecilor sau pachetelor în Python pe profunzimea și regularitatea listelor imbricate.

În acest tutorial, vom lucra la diferite metode pentru a aplatiza listele imbricate folosind limbajul de programare Python. Dar înainte de a începe, să înțelegem tipurile de liste imbricate.

Care sunt tipurile de liste imbricate?

După cum știm, Piton este un limbaj de programare slab tastat. Prin urmare, putem întâlni două tipuri de Listă de liste. Aceste liste de liste sau liste imbricate sunt după cum urmează:

  1. Lista obișnuită de liste
  2. Listă neregulată de liste

Lista obișnuită de liste

Fiecare articol din Lista obișnuită a listelor este denumit sub-listă, observându-se astfel uniformitatea tipului de element. De exemplu: [[9, 8, 7], [6, 5, 4], [3, 2, 1]] este o listă obișnuită de liste ca [9, 8, 7], [6, 5, 4] , [3, 2, 1] este de tip listă.

Listă neregulată de liste

hopa

Fiecare element din Lista neregulată de liste este fie denumit sub-listă, fie element non-listă (de exemplu, un șir sau un număr întreg). Astfel, există o neregulă în ceea ce privește tipul de element. De exemplu: [[9, 8, 7], [6, 5], 4, 3] este o listă neregulată de liste, deoarece [9, 8, 7] și [6, 5] sunt din tipurile de liste, în timp ce 4 iar 3 sunt de tip int.

Aplatizarea listei de liste utilizând buclele imbricate pentru

Aplatizarea listei de liste cu imbricatul pentru Ajutorul Loops este considerat o abordare cu forță brută pentru a obține o listă plată. Putem efectua această metodă selectând fiecare articol din Lista bidimensională și aranjându-l într-o listă unidimensională.

Să luăm în considerare următorul exemplu care funcționează atât pentru liste de liste obișnuite, cât și pentru cele neregulate.

Exemplu:

 # 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)) 

Ieșire:

 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] 

Explicaţie:

În exemplul de mai sus, am definit o funcție ca flattenlist care preia un parametru ca _2dlist . Am folosit apoi pentru buclă pentru a repeta elementele listei imbricate și pentru a le adăuga pentru a genera o listă aplatizată. Apoi am definit lista imbricată și am implementat flattenlist funcţie. Ca rezultat, lista imbricată s-a transformat cu succes în lista aplatizată.

Aplatizarea listei imbricate folosind o listă de înțelegere

Aplatizarea listei de liste cu ajutorul unei liste de înțelegere este considerată o abordare elegantă pentru a obține o listă plată în funcție de o listă bidimensională existentă. Cu toate acestea, această abordare oferă o soluție mai puțin intuitivă.

Să luăm în considerare următorul exemplu.

Exemplu:

 # 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) 

Ieșire:

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

Explicaţie:

În exemplul de mai sus, am definit o listă imbricată și o listă de înțelegere. Apoi le-am tipărit pentru utilizatori. Ca rezultat, lista imbricată a fost transformată cu succes în lista aplatizată.

Aplatizarea listei de liste folosind metoda recursiva

De asemenea, putem folosi metoda recursivă pentru a aplatiza lista bidimensională. Să luăm în considerare următorul exemplu de implementare a metodei recursive pentru a aplatiza lista de liste. Această implementare funcționează bine pentru liste obișnuite și neregulate.

Exemplu:

 # 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])) 

Ieșire:

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

Explicaţie:

În exemplul de mai sus, am definit o funcție și am folosit un dacă afirmație indicând dacă lungimea listei imbricate este egală cu zero, apoi returnează lista imbricată.

string.format java

Dacă elementul de date de pe indexul zero este o instanță a unei liste, atunci indexul listei intră din nou în funcție și se adaugă la următorul index al listei și așa mai departe. În caz contrar, funcția va returna elementele și așa mai departe. În cele din urmă, am definit lista imbricată și am executat funcția. Ca rezultat, lista de liste s-a aplatizat recursiv.

Utilizarea bibliotecilor Python

De asemenea, putem folosi unele dintre bibliotecile limbajului de programare Python pentru a aplatiza lista de liste. Implementarea acestor biblioteci este descrisă mai jos:

Aplatizarea listei de liste folosind functools și biblioteci de operatori

The operator biblioteca oferă iconcat() funcția de a efectua operația fundamentală precum concatenarea. Putem aplica această funcție în mod cumulativ elementelor de date ale unei liste imbricate, de la stânga la dreapta, rezultând reducerea listei imbricate la o listă aplatizată.

Să luăm în considerare următorul exemplu pentru a înțelege implementarea acestuia.

Exemplu:

 # 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, [])) 

Ieșire:

 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] 

Explicaţie:

În exemplul de mai sus, am importat functools biblioteca împreună cu operator bibliotecă. Am definit apoi o listă goală ca lista regulata . Am definit apoi o funcție ca convo pentru a transforma lista de liste într-o listă aplatizată. În această funcție, am folosit pentru buclă în care elementele din lista imbricată sunt atașate la lista goală pe care am definit-o mai devreme. Mai târziu am definit lista imbricată și executăm funcția. Ca rezultat, lista de liste este convertită cu succes într-o listă aplatizată.

convertiți int în șir

Aplatizarea listei de liste folosind biblioteca itertools

The iertools biblioteca oferă lanţ() funcție care ne permite să transformăm o listă imbricată într-o singură listă aplatizată în mod ideal. Această funcție tratează seriile consecutive ca o singură serie prin iterarea lor prin iterabilul transmis ca parametru într-un mod serial.

Să luăm în considerare următorul exemplu:

Exemplu:

 # 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 

Ieșire:

 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] 

Explicaţie:

În exemplul de mai sus, am importat iertools bibliotecă și a generat o listă imbricată. Am folosit apoi lanţ() funcția de a converti lista imbricată dată în lista aplatizată. În cele din urmă, am returnat rezultatul utilizatorilor. Ca urmare, lista de liste este aplatizată cu succes.

Aplatizarea listei de liste folosind biblioteca NumPy

The NumPy biblioteca oferă diverse operațiuni de zi cu zi, inclusiv concatenarea matricelor obișnuite bidimensionale pe coloană sau pe rând. Vom folosi atributul cunoscut ca apartament pentru a obține un Iterator unidimensional peste matrice pentru a cuceri ținta. Să luăm în considerare următorul exemplu pentru a înțelege utilizarea funcției de concatenare și a atributului plat.

Exemplu:

 # 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) 

Ieșire:

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

Explicaţie:

În exemplul de mai sus, am importat numpy bibliotecă și a definit o listă imbricată. Am folosit apoi înlănţui funcția de numpy biblioteca împreună cu ea apartament atribut pentru a aplatiza elementele listei imbricate și a le concatena la o nouă listă aplatizată. În cele din urmă, am tipărit rezultatul pentru utilizatori. Astfel, lista de liste este aplatizată cu succes.

Utilizarea funcțiilor de bază

De asemenea, putem efectua sarcina de aplatizare utilizând unele funcții de bază pe care limbajul de programare Python le oferă.

Aplatizarea listei de liste folosind funcția sum

Putem considera însumarea listelor interioare ca o altă soluție la problemă. Transmitem două argumente lui sumă funcția: primul parametru este iterabil , care este o listă imbricată, iar al doilea parametru este start care este o listă nulă pentru următorul caz care servește ca listă plată inițială la care se vor adăuga elementele de date ale sublistelor interioare.

Putem spune că această abordare este destul de convenabilă, deoarece nu trebuie să importam nimic. Cu toate acestea, este mai lent decât iertools() și lanţ() funcţionează atunci când există un număr mare de sub-liste prezente în lista imbricată.

Să luăm în considerare următorul exemplu:

Exemplu:

 # 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) 

Ieșire:

ce este s în python
 The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90] 

Explicaţie:

În exemplul de mai sus, am definit lista imbricată. Am folosit apoi sumă() și a aplatizat lista imbricată într-o listă unidimensională și a tipărit lista rezultată pentru utilizatori. Drept urmare, am transformat cu succes lista de liste într-o listă plată.

Aplatizarea listei de liste folosind cuvântul cheie Lambda

Putem defini o funcție anonimă folosind cuvântul cheie lambda . Putem trece lista obișnuită/neregulată ca parametru acestei funcții anonime. Evaluarea expresiei se face pentru a obține o listă unidimensională plată.

Să luăm în considerare următorul exemplu:

Exemplu:

 # 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)) 

Ieșire:

 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] 

Explicaţie:

În exemplul de mai sus, am definit o listă imbricată. Am folosit apoi lambda cuvânt cheie împreună cu un argument care definește o expresie pentru înțelegerea listei. Apoi le-am tipărit pentru utilizatori. Ca rezultat, am convertit cu succes Lista neregulată bidimensională în Lista aplatizată.