logo

Zlúčený zoznam v Pythone

Predstavenie

A Zoznam sa považuje za jednu z najflexibilnejších dátových štruktúr v programovacom jazyku Python. Na druhej strane, dvojrozmerný zoznam alebo 2D zoznam, ktorý sa všeobecne nazýva zoznam zoznamov, je objektom zoznamu, kde každý prvok je zoznamom samotným. Napríklad: [[19, 18, 17], [16, 15, 14], [13, 12, 11]].

Sploštenie zoznamu zoznamov je proces transformácie dvojrozmerného zoznamu na jednorozmerný zoznam zrušením vnorenia každého prvku zoznamu uloženého v zozname zoznamov, to znamená transformáciou [[9, 8, 7], [6 , 5, 4], [3, 2, 1]] až [9, 8, 7, 6, 5, 4, 3, 2, 1].

Proces sploštenia môžeme vykonať pomocou vnoreného pre slučky, rekurzia, porozumenie zoznamov, základné funkcie alebo import knižníc alebo balíkov v Pythone na základe hĺbky a pravidelnosti vnorených zoznamov.

V tomto návode budeme pracovať na rôznych metódach na vyrovnanie vnorených zoznamov pomocou programovacieho jazyka Python. Než však začneme, poďme pochopiť typy vnorených zoznamov.

Aké sú typy vnorených zoznamov?

Ako vieme, Python je slabo napísaný programovací jazyk. Preto sa môžeme stretnúť s dvoma typmi Zoznamov. Tieto zoznamy alebo vnorené zoznamy sú nasledovné:

  1. Pravidelný zoznam zoznamov
  2. Nepravidelný zoznam zoznamov

Pravidelný zoznam zoznamov

Každá položka v riadnom zozname zoznamov sa označuje ako podzoznam, čím sa zachováva jednotnosť typu prvku. Napríklad: [[9, 8, 7], [6, 5, 4], [3, 2, 1]] je bežný zoznam zoznamov ako [9, 8, 7], [6, 5, 4] , [3, 2, 1] je typu zoznam.

Nepravidelný zoznam zoznamov

java double to string

Každá položka v nepravidelnom zozname zoznamov sa označuje buď ako prvok podzoznamu alebo ako prvok mimo zoznamu (napríklad reťazec alebo celé číslo). Existuje teda nepravidelnosť, pokiaľ ide o typ prvku. Napríklad: [[9, 8, 7], [6, 5], 4, 3] je nepravidelný zoznam zoznamov, pretože [9, 8, 7] a [6, 5] sú zoznamy typov, zatiaľ čo 4 a 3 sú typu int.

Sploštenie zoznamu zoznamov pomocou funkcie Nested for Loops

Sploštenie zoznamu zoznamov s vnorenými pre Loopsova pomoc sa považuje za prístup hrubej sily na získanie plochého zoznamu. Túto metódu môžeme vykonať výberom každej položky z dvojrozmerného zoznamu a jej usporiadaním do jednorozmerného zoznamu.

Uvažujme o nasledujúcom príklade, ktorý funguje pre bežné aj nepravidelné zoznamy.

Príklad:

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

Výkon:

 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] 

Vysvetlenie:

Vo vyššie uvedenom príklade sme definovali funkciu ako flattenlist ktorý berie parameter ako _2dlist . Potom sme použili pre slučku na iteráciu prvkov vnoreného zoznamu a ich pridanie na vytvorenie splošteného zoznamu. Potom sme definovali vnorený zoznam a implementovali ho flattenlist funkciu. Výsledkom je, že vnorený zoznam sa úspešne transformoval na sploštený zoznam.

Sploštenie vnoreného zoznamu pomocou porozumenia zoznamu

Sploštenie zoznamu zoznamov pomocou funkcie List Comprehension sa považuje za elegantný prístup na získanie plochého zoznamu v závislosti od existujúceho dvojrozmerného zoznamu. Tento prístup však ponúka menej intuitívne riešenie.

Uvažujme o nasledujúcom príklade.

Príklad:

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

Výkon:

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

Vysvetlenie:

Vo vyššie uvedenom príklade sme definovali vnorený zoznam a porozumenie zoznamu. Potom sme ich vytlačili pre používateľov. Výsledkom je, že vnorený zoznam bol úspešne transformovaný na plochý zoznam.

Sploštenie zoznamu zoznamov pomocou rekurzívnej metódy

Na vyrovnanie dvojrozmerného zoznamu môžeme použiť aj rekurzívnu metódu. Pozrime sa na nasledujúci príklad implementácie rekurzívnej metódy, aby sme sploštili zoznam zoznamov. Táto implementácia funguje dobre pre pravidelný aj nepravidelný zoznam zoznamov.

Príklad:

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

Výkon:

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

Vysvetlenie:

Vo vyššie uvedenom príklade sme definovali funkciu a použili sme an ak vyhlásenie s uvedením, či sa dĺžka vnoreného zoznamu rovná nule, potom vráti vnorený zoznam.

reťazcový formát java

Ak je dátový prvok na nultom indexe inštanciou zoznamu, potom index zoznamu znova prejde do funkcie a pridá sa k nasledujúcemu indexu zoznamu atď. V opačnom prípade funkcia vráti prvky atď. Nakoniec sme definovali vnorený zoznam a spustili funkciu. V dôsledku toho sa zoznam zoznamov rekurzívne sploštil.

Používanie knižníc Pythonu

Na vyrovnanie zoznamu zoznamov môžeme použiť aj niektoré knižnice programovacieho jazyka Python. Implementácia týchto knižníc je popísaná nižšie:

Sploštenie zoznamu zoznamov pomocou funkčných nástrojov a knižníc operátorov

The operátor knižnica poskytuje iconcat() vykonávať základnú operáciu, ako je zreťazenie. Túto funkciu môžeme aplikovať kumulatívne na dátové prvky vnoreného zoznamu, zľava doprava, čo vedie k redukcii vnoreného zoznamu na sploštený zoznam.

Pozrime sa na nasledujúci príklad, aby sme pochopili jeho implementáciu.

Príklad:

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

Výkon:

 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] 

Vysvetlenie:

ml až oz

Vo vyššie uvedenom príklade sme importovali functools knižnica spolu s operátor knižnica. Potom sme definovali prázdny zoznam ako pravidelný zoznam . Potom sme definovali funkciu ako konvoj transformovať zoznam zoznamov na sploštený zoznam. V tejto funkcii sme použili pre slučka, kde sú prvky z vnoreného zoznamu pripojené k prázdnemu zoznamu, ktorý sme definovali skôr. Neskôr sme definovali vnorený zoznam a vykonali funkciu. V dôsledku toho sa zoznam zoznamov úspešne skonvertuje na plochý zoznam.

Sploštenie zoznamu zoznamov pomocou knižnice itertools

The itertools knižnica poskytuje reťaz () funkcia, ktorá nám umožňuje ideálne transformovať vnorený zoznam na jeden sploštený zoznam. Táto funkcia zaobchádza s po sebe nasledujúcimi sériami ako s jednou sériou tak, že ich iteruje cez iterovateľný parameter odovzdaný sériovým spôsobom.

Uvažujme o nasledujúcom príklade:

Príklad:

 # 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 

Výkon:

 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] 

Vysvetlenie:

Vo vyššie uvedenom príklade sme importovali itertools knižnicu a vygeneroval vnorený zoznam. Potom sme použili reťaz () na konverziu daného vnoreného zoznamu na sploštený zoznam. Nakoniec sme výsledok vrátili používateľom. V dôsledku toho je zoznam zoznamov úspešne vyrovnaný.

Sploštenie zoznamu zoznamov pomocou knižnice NumPy

The NumPy knižnica poskytuje rôzne každodenné operácie vrátane zreťazenia dvojrozmerných pravidelných polí po stĺpcoch alebo riadkoch. Použijeme atribút známy ako plochý s cieľom dostať cez pole jednorozmerný iterátor na dobytie cieľa. Pozrime sa na nasledujúci príklad, aby sme pochopili použitie funkcie zreťazenia a atribútu flat.

Príklad:

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

Výkon:

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

Vysvetlenie:

Vo vyššie uvedenom príklade sme importovali numpy knižnicu a definoval vnorený zoznam. Potom sme použili zreťaziť funkciu numpy knižnica spolu s jej plochý atribút na vyrovnanie prvkov vnoreného zoznamu a ich zreťazenie do nového splošteného zoznamu. Nakoniec sme pre používateľov vytlačili výsledok. Zoznam zoznamov je teda úspešne vyrovnaný.

Využitie základných funkcií

Úlohu sploštenia môžeme vykonať aj využitím niektorých základných funkcií, ktoré poskytuje programovací jazyk Python.

Sploštenie zoznamu zoznamov pomocou funkcie súčtu

Za ďalšie riešenie problému môžeme považovať sčítanie cez vnútorné zoznamy. Odovzdáme dva argumenty súčet funkcia: Prvý parameter je iterovateľné , čo je vnorený zoznam, a druhý parameter je začať čo je prázdny zoznam pre nasledujúci prípad, ktorý slúži ako počiatočný plochý zoznam, do ktorého sa pridajú dátové prvky vnútorných podzoznamov.

Môžeme povedať, že tento prístup je celkom pohodlný, pretože nemusíme nič importovať. Je však pomalší ako itertools() a reťaz () funguje, keď je vo vnorenom zozname prítomný veľký počet podzoznamov.

mapa v strojopise

Uvažujme o nasledujúcom príklade:

Príklad:

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

Výkon:

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

Vysvetlenie:

Vo vyššie uvedenom príklade sme definovali vnorený zoznam. Potom sme použili suma() a zlúčili vnorený zoznam do jednorozmerného zoznamu a vytlačili výsledný zoznam pre používateľov. V dôsledku toho sme úspešne transformovali zoznam zoznamov na plochý zoznam.

Sploštenie zoznamu zoznamov pomocou kľúčového slova Lambda

Anonymnú funkciu môžeme definovať pomocou kľúčového slova lambda . Pravidelný/nepravidelný zoznam môžeme odovzdať ako parameter tejto anonymnej funkcii. Vyhodnotenie výrazu sa vykonáva s cieľom získať plochý jednorozmerný zoznam.

Uvažujme o nasledujúcom príklade:

Príklad:

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

Výkon:

 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] 

Vysvetlenie:

Vo vyššie uvedenom príklade sme definovali vnorený zoznam. Potom sme použili lambda kľúčové slovo spolu s argumentom definujúcim výraz na pochopenie zoznamu. Potom sme ich vytlačili pre používateľov. V dôsledku toho sme úspešne previedli dvojrozmerný nepravidelný zoznam na sploštený zoznam.