Uvod
A Popis se smatra jednom od najfleksibilnijih struktura podataka u programskom jeziku Python. S druge strane, dvodimenzionalni popis ili 2D popis, koji se općenito naziva popis popisa, objekt je popisa gdje je svaki element sam popis. Na primjer: [[19, 18, 17], [16, 15, 14], [13, 12, 11]].
Izjednačavanje popisa popisa proces je transformacije dvodimenzionalnog popisa u jednodimenzionalni popis uklanjanjem gniježđenja svakog elementa popisa koji se čuva na popisu popisa, odnosno transformacijom [[9, 8, 7], [6 , 5, 4], [3, 2, 1]] do [9, 8, 7, 6, 5, 4, 3, 2, 1].
Proces ravnanja možemo izvesti uz pomoć ugniježđenog za petlje, rekurzija, razumijevanje popisa, osnovne funkcije ili uvoz knjižnica ili paketa u Python o dubini i pravilnosti ugniježđenih popisa.
U ovom vodiču ćemo raditi na različitim metodama kako bismo poravnali ugniježđene popise pomoću programskog jezika Python. Ali prije nego što počnemo, shvatit ćemo vrste ugniježđenih popisa.
Koje su vrste ugniježđenih popisa?
Kao što znamo, Piton je slabo tipiziran programski jezik. Stoga možemo susresti dvije vrste popisa popisa. Ovi popisi popisa ili ugniježđeni popisi su sljedeći:
- Redovni popis popisa
- Nepravilan popis popisa
Redovni popis popisa
Svaka stavka u redovnom popisu popisa naziva se pod-popisom, čime se poštuje ujednačenost tipa elementa. Na primjer: [[9, 8, 7], [6, 5, 4], [3, 2, 1]] je običan popis popisa kao što su [9, 8, 7], [6, 5, 4] , [3, 2, 1] je tipa liste.
Nepravilan popis popisa
stol od lateksa
Svaka stavka na nepravilnom popisu popisa naziva se elementom podpopisa ili elementom koji nije popis (na primjer, niz ili cijeli broj). Dakle, postoji nepravilnost u pogledu vrste elementa. Na primjer: [[9, 8, 7], [6, 5], 4, 3] je nepravilan popis popisa jer su [9, 8, 7] i [6, 5] tipovi popisa, dok su 4 a 3 su tipa int.
Izjednačavanje popisa popisa pomoću petlji Nested for
Izjednačavanje popisa popisa s ugniježđenim za Loopsova pomoć se smatra pristupom grube sile za dobivanje ravnog popisa. Ovu metodu možemo izvesti odabirom svake stavke s dvodimenzionalnog popisa i raspoređivanjem u jednodimenzionalni popis.
Razmotrimo sljedeći primjer koji funkcionira i za regularne i za nepravilne popise popisa.
Primjer:
# 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))
Izlaz:
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]
Obrazloženje:
U gornjem primjeru definirali smo funkciju kao poravnati popis koji uzima parametar kao _2dlist . Zatim smo koristili za petlja za ponavljanje elemenata ugniježđenog popisa i njihovo dodavanje za generiranje spljoštenog popisa. Zatim smo definirali ugniježđeni popis i implementirali poravnati popis funkcija. Kao rezultat toga, ugniježđeni popis se uspješno transformirao u spljošteni popis.
Izjednačavanje ugniježđenog popisa pomoću razumijevanja popisa
Izjednačavanje popisa popisa uz pomoć razumijevanja popisa smatra se elegantnim pristupom za dobivanje ravnog popisa ovisno o dvodimenzionalnom postojećem popisu. Međutim, ovaj pristup nudi manje intuitivno rješenje.
Razmotrimo sljedeći primjer.
Primjer:
# 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)
Izlaz:
Genuine list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90]
Obrazloženje:
U gornjem primjeru definirali smo ugniježđeni popis i razumijevanje popisa. Zatim smo ih ispisali za korisnike. Kao rezultat toga, ugniježđeni popis je uspješno pretvoren u spljošteni popis.
Izjednačavanje popisa popisa pomoću rekurzivne metode
Također možemo koristiti rekurzivnu metodu za izravnavanje dvodimenzionalne liste. Razmotrimo sljedeći primjer implementacije rekurzivne metode kako bismo spljoštili popis popisa. Ova implementacija dobro funkcionira za uobičajene kao i nepravilne popise popisa.
Primjer:
# 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]))
Izlaz:
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
Obrazloženje:
U gornjem primjeru definirali smo funkciju i upotrijebili ako izjava navodeći ako je duljina ugniježđene liste jednaka nuli, tada vraća ugniježđenu listu.
string format java
Ako je podatkovni element na nultom indeksu instanca popisa, tada indeks popisa ponovno ulazi u funkciju i dodaje se sljedećem indeksu popisa i tako dalje. Inače će funkcija vratiti elemente i tako dalje. Napokon smo definirali ugniježđeni popis i izvršili funkciju. Kao rezultat toga, popis popisa se rekurzivno spljoštio.
Korištenje biblioteka Pythona
Također možemo upotrijebiti neke od biblioteka programskog jezika Python da izravnamo popis popisa. Implementacija ovih biblioteka opisana je u nastavku:
Izjednačavanje popisa popisa pomoću funkcijskih alata i biblioteka operatora
The operater knjižnica pruža iconcat() funkcija za izvođenje temeljne operacije poput ulančavanja. Ovu funkciju možemo primijeniti kumulativno na podatkovne elemente ugniježđenog popisa, slijeva na desno, što rezultira redukcijom ugniježđenog popisa na spljošteni popis.
Razmotrimo sljedeći primjer kako bismo razumjeli njegovu implementaciju.
Primjer:
# 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, []))
Izlaz:
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]
Obrazloženje:
U gornjem primjeru uvezli smo functools knjižnica zajedno s operater knjižnica. Zatim smo definirali prazan popis kao regularlist . Zatim smo definirali funkciju kao razgovor za transformaciju popisa popisa u spljošteni popis. U ovoj funkciji koristili smo za petlja gdje se elementi s ugniježđene liste dodaju praznoj listi koju smo ranije definirali. Kasnije smo definirali ugniježđeni popis i izvršavamo funkciju. Kao rezultat toga, popis popisa uspješno se pretvara u spljošteni popis.
Izjednačavanje popisa popisa pomoću biblioteke itertools
The itertools knjižnica pruža lanac() funkcija koja nam omogućuje transformaciju ugniježđenog popisa u jedan spljošteni popis idealno. Ova funkcija tretira uzastopne nizove kao jedan niz ponavljajući ih preko iterabilnog elementa proslijeđenog kao parametar na serijski način.
Razmotrimo sljedeći primjer:
Primjer:
# 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
Izlaz:
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]
Obrazloženje:
U gornjem primjeru uvezli smo itertools biblioteku i generirao ugniježđeni popis. Zatim smo upotrijebili lanac() funkcija za pretvaranje zadanog ugniježđenog popisa u spljošteni popis. Napokon smo vratili rezultat korisnicima. Kao rezultat toga, popis popisa je uspješno spljošten.
Izjednačavanje popisa popisa pomoću biblioteke NumPy
The NumPy knjižnica pruža razne svakodnevne operacije, uključujući ulančavanje dvodimenzionalnih regularnih nizova po stupcima ili po redovima. Koristit ćemo atribut poznat kao ravan kako bi se dobio jednodimenzionalni iterator preko niza za osvajanje cilja. Razmotrimo sljedeći primjer kako bismo razumjeli upotrebu funkcije spajanja i ravnog atributa.
Primjer:
koji je napravio školu
# 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)
Izlaz:
The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90]
Obrazloženje:
U gornjem primjeru uvezli smo numpy biblioteku i definirao ugniježđeni popis. Zatim smo upotrijebili ulančati funkcija numpy knjižnica zajedno sa svojim ravan atribut za izravnavanje elemenata ugniježđenog popisa i njihovo spajanje u novi spljošteni popis. Napokon smo ispisali rezultat za korisnike. Dakle, popis popisa je uspješno spljošten.
Korištenje osnovnih funkcija
Također možemo izvršiti zadatak spljoštenja korištenjem nekih osnovnih funkcija koje pruža programski jezik Python.
Izjednačavanje popisa popisa pomoću funkcije zbroja
Zbrajanje preko unutarnjih lista možemo smatrati drugim rješenjem problema. Prosljeđujemo dva argumenta iznos funkcija: Prvi parametar je iterable , koji je ugniježđeni popis, a drugi parametar je početak što je prazna lista za sljedeći slučaj koji služi kao početna ravna lista gdje će se dodavati elementi podataka unutarnjih pod-lista.
Možemo reći da je ovaj pristup prilično zgodan jer ne moramo ništa uvoziti. Međutim, sporiji je od itertools() i lanac() funkcionira kada postoji veliki broj pod-popisa prisutnih u ugniježđenom popisu.
Razmotrimo sljedeći primjer:
upotrebe operativnog sustava
Primjer:
# 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)
Izlaz:
The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90]
Obrazloženje:
U gornjem primjeru definirali smo ugniježđenu listu. Zatim smo upotrijebili iznos() funkciju i spljoštio ugniježđeni popis u jednodimenzionalni popis i ispisao rezultirajući popis za korisnike. Kao rezultat toga, uspješno smo transformirali popis popisa u ravni popis.
Izjednačavanje popisa popisa pomoću ključne riječi Lambda
Pomoću ključne riječi možemo definirati anonimnu funkciju lambda . Možemo proslijediti regularni/neregularni popis kao parametar ovoj anonimnoj funkciji. Procjena izraza se radi kako bi se dobila ravna jednodimenzionalna lista.
Razmotrimo sljedeći primjer:
Primjer:
# 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))
Izlaz:
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]
Obrazloženje:
U gornjem primjeru definirali smo ugniježđenu listu. Zatim smo upotrijebili lambda ključna riječ zajedno s argumentom koji definira izraz za razumijevanje popisa. Zatim smo ih ispisali za korisnike. Kao rezultat toga, uspješno smo pretvorili dvodimenzionalni nepravilni popis u spljošteni popis.