logo

Litistä luettelo Pythonissa

Esittely

A Lista pidetään yhtenä Python-ohjelmointikielen joustavimmista tietorakenteista. Toisaalta kaksiulotteinen luettelo tai 2D-luettelo, jota yleensä kutsutaan luetteloluetteloksi, on luettelon objekti, jossa jokainen elementti on itse luettelo. Esimerkiksi: [[19, 18, 17], [16, 15, 14], [13, 12, 11]].

Listojen tasoitus on prosessi, jossa kaksiulotteinen lista muunnetaan yksiulotteiseksi listaksi poistamalla sisäkkäiset kaikki listassa olevat listaelementit, eli muuntamalla [[9, 8, 7], [6 , 5, 4], [3, 2, 1]] - [9, 8, 7, 6, 5, 4, 3, 2, 1].

Voimme suorittaa litistysprosessin sisäkkäisen avulla varten silmukat, rekursio, luettelon ymmärtäminen, ydinfunktiot tai kirjastojen tai pakettien tuonti Pythonissa sisäkkäisten luetteloiden syvyyden ja säännöllisyyden perusteella.

Tässä opetusohjelmassa käsittelemme erilaisia ​​menetelmiä sisäkkäisten luetteloiden tasoittamiseksi Python-ohjelmointikielellä. Mutta ennen kuin aloitamme, meidän on ymmärrettävä sisäkkäisten luetteloiden tyypit.

Mitkä ovat sisäkkäisten luetteloiden tyypit?

Kuten tiedämme, Python on heikosti kirjoitettu ohjelmointikieli. Siksi voimme kohdata kahdenlaisia ​​luetteloluetteloita. Nämä luettelot tai sisäkkäiset luettelot ovat seuraavat:

  1. Tavallinen luettelo luetteloista
  2. Epäsäännöllinen luetteloluettelo

Tavallinen luettelo luetteloista

Kutakin Tavallisen luettelon kohtaa kutsutaan aliluetteloksi, jolloin huomioidaan elementin tyypin yhtenäisyys. Esimerkiksi: [[9, 8, 7], [6, 5, 4], [3, 2, 1]] on tavallinen luettelo luetteloista, kuten [9, 8, 7], [6, 5, 4] , [3, 2, 1] on luettelotyyppiä.

Epäsäännöllinen luetteloluettelo

np. missä

Epäsäännöllisen luettelon jokaista kohdetta kutsutaan joko aliluetteloksi tai ei-luetteloelementiksi (esimerkiksi merkkijono tai kokonaisluku). Siten elementin tyypissä on epäsäännöllisyys. Esimerkiksi: [[9, 8, 7], [6, 5], 4, 3] on epäsäännöllinen luettelo luetteloista, koska [9, 8, 7] ja [6, 5] ovat luettelotyyppejä, kun taas 4 ja 3 ovat int-tyyppiä.

Listaluettelon tasoitus käyttämällä Nested for Loops -toimintoa

Listaluettelon tasoittaminen sisäkkäisillä varten Loopsin apua pidetään raakana voimana tasaisen listan saamiseksi. Voimme suorittaa tämän menetelmän valitsemalla kunkin kohteen kaksiulotteisesta luettelosta ja järjestämällä sen yksiulotteiseksi luetteloksi.

Tarkastellaan seuraavaa esimerkkiä, joka toimii sekä tavallisille että epäsäännöllisille listaluetteloille.

Esimerkki:

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

Lähtö:

 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] 

Selitys:

Yllä olevassa esimerkissä olemme määrittäneet funktion muodossa flattenlist joka ottaa parametrin as _2dlist . Olemme sitten käyttäneet varten silmukan toistaaksesi sisäkkäisen luettelon elementtejä ja liittääksesi ne luodaksesi litteän luettelon. Olemme sitten määrittäneet sisäkkäisen luettelon ja toteuttaneet sen flattenlist toiminto. Tämän seurauksena sisäkkäinen luettelo on onnistuneesti muutettu litistetyksi luetteloksi.

Sisäkkäisen luettelon tasoittaminen luettelon ymmärtämisen avulla

Listaluettelon tasoittamista luettelon ymmärtämisen avulla pidetään tyylikkäänä tapana saada tasainen luettelo riippuen olemassa olevasta kaksiulotteisesta luettelosta. Tämä lähestymistapa tarjoaa kuitenkin vähemmän intuitiivisen ratkaisun.

Tarkastellaanpa seuraavaa esimerkkiä.

Esimerkki:

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

Lähtö:

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

Selitys:

Yllä olevassa esimerkissä olemme määrittäneet sisäkkäisen luettelon ja luettelon ymmärtämisen. Olemme sitten tulostaneet ne käyttäjille. Tämän seurauksena sisäkkäinen luettelo on muutettu litteäksi luetteloksi onnistuneesti.

Listaluettelon tasoitus rekursiivisella menetelmällä

Voimme myös käyttää rekursiivista menetelmää kaksiulotteisen luettelon tasoittamiseksi. Tarkastellaan seuraavaa esimerkkiä rekursiivisen menetelmän toteuttamisesta listaluettelon tasoittamiseksi. Tämä toteutus toimii hyvin sekä tavallisissa että epäsäännöllisissä luetteloissa.

Esimerkki:

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

Lähtö:

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

Selitys:

Yllä olevassa esimerkissä olemme määrittäneet funktion ja käyttäneet an jos lausunto ilmoittaa, jos sisäkkäisen luettelon pituus on nolla, palauta sisäkkäinen luettelo.

hakkeroinnin käsittely

Jos nollaindeksin tietoelementti on luettelon esiintymä, niin listaindeksi menee uudelleen funktioon ja lisää listan seuraavaan indeksiin ja niin edelleen. Muutoin funktio palauttaa elementit ja niin edelleen. Viimeinkin olemme määrittäneet sisäkkäisen luettelon ja suorittaneet toiminnon. Tämän seurauksena luetteloiden luettelo on litistynyt rekursiivisesti.

Pythonin kirjastojen käyttäminen

Voimme myös käyttää joitain Python-ohjelmointikielen kirjastoja litistämään luetteloita. Näiden kirjastojen toteutus on kuvattu alla:

Listaluettelon litistäminen funktiotyökalujen ja operaattorikirjastojen avulla

The operaattori kirjasto tarjoaa iconcat() toiminto suorittaa perusoperaation, kuten ketjutuksen. Voimme soveltaa tätä funktiota kumulatiivisesti sisäkkäisen luettelon tietoelementteihin vasemmalta oikealle, jolloin sisäkkäinen luettelo pienenee litteäksi listaksi.

Tarkastellaan seuraavaa esimerkkiä ymmärtääksemme sen täytäntöönpanon.

Esimerkki:

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

Lähtö:

 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] 

Selitys:

Yllä olevassa esimerkissä olemme tuoneet toiminnalliset työkalut kirjasto yhdessä operaattori kirjasto. Tämän jälkeen olemme määrittäneet tyhjän luettelon säännöllinen lista . Olemme sitten määritelleet funktion muodossa convo muuttaaksesi luetteloluettelon litteäksi luetteloksi. Tässä toiminnossa olemme käyttäneet varten silmukan, jossa sisäkkäisen luettelon elementit liitetään aiemmin määrittämäämme tyhjään luetteloon. Myöhemmin olemme määrittäneet sisäkkäisen listan ja suorittaneet toiminnon. Tämän seurauksena luetteloiden luettelo muunnetaan litteäksi luetteloksi onnistuneesti.

Listaluettelon litistäminen itertools-kirjaston avulla

The itert-työkalut kirjasto tarjoaa ketju() toiminto, jonka avulla voimme mieluiten muuttaa sisäkkäisen luettelon yhdeksi litteäksi luetteloksi. Tämä funktio käsittelee peräkkäisiä sarjoja yhtenä sarjana iteroimalla ne parametrina välitetyn iteroitavan kautta sarjamuotoisesti.

Tarkastellaanpa seuraavaa esimerkkiä:

Esimerkki:

 # 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 

Lähtö:

muuntaa merkkijonon int
 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] 

Selitys:

Yllä olevassa esimerkissä olemme tuoneet iter-työkalut kirjasto ja loi sisäkkäisen luettelon. Olemme sitten käyttäneet ketju() toiminto muuntaa annetun sisäkkäisen luettelon litteäksi luetteloksi. Viimeinkin olemme palauttaneet tuloksen käyttäjille. Tämän seurauksena luetteloiden luettelo on litistetty onnistuneesti.

Listaluettelon litistäminen NumPy-kirjaston avulla

The NumPy kirjasto tarjoaa erilaisia ​​päivittäisiä toimintoja, mukaan lukien kaksiulotteisten säännöllisten taulukoiden yhdistämisen sarake- tai rivikohtaisesti. Käytämme attribuuttia, joka tunnetaan nimellä tasainen saadakseen yksiulotteisen iteraattorin taulukon yli valloittamaan kohteen. Tarkastellaan seuraavaa esimerkkiä ymmärtääksemme ketjutusfunktion ja flat-attribuutin käytön.

Esimerkki:

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

Lähtö:

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

Selitys:

Yllä olevassa esimerkissä olemme tuoneet nuhjuinen kirjasto ja määritteli sisäkkäisen luettelon. Olemme sitten käyttäneet ketjuttaa toiminto nuhjuinen kirjasto sen mukana tasainen attribuutti litistää sisäkkäisen luettelon elementit ja ketjuttaa ne uudeksi litteäksi luetteloksi. Viimeinkin olemme tulostaneet tuloksen käyttäjille. Siten listaluettelo on litistetty onnistuneesti.

Ydintoimintojen hyödyntäminen

Voimme myös suorittaa litistystehtävän hyödyntämällä joitain Python-ohjelmointikielen tarjoamia ydintoimintoja.

Listaluettelon litistäminen summafunktiolla

Voimme pitää sisäisten luetteloiden yhteenvetoa yhtenä ratkaisuna ongelmaan. Välitämme kaksi argumenttia summa toiminto: Ensimmäinen parametri on toistettavissa , joka on sisäkkäinen luettelo, ja toinen parametri on alkaa joka on tyhjä lista seuraavalle tapaukselle, joka toimii alkuperäisenä tasaisena luettelona, ​​johon sisäisten aliluetteloiden tietoelementit lisätään.

Voimme sanoa, että tämä lähestymistapa on melko kätevä, koska meidän ei tarvitse tuoda mitään. Se on kuitenkin hitaampi kuin itertools() ja ketju() toimii, kun sisäkkäisessä luettelossa on suuri määrä aliluetteloita.

Tarkastellaanpa seuraavaa esimerkkiä:

Esimerkki:

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

Lähtö:

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

Selitys:

Yllä olevassa esimerkissä olemme määrittäneet sisäkkäisen luettelon. Olemme sitten käyttäneet summa() funktio ja litistettiin sisäkkäinen luettelo yksiulotteiseksi luetteloksi ja tulostettiin tuloksena oleva luettelo käyttäjille. Tämän seurauksena olemme muuttaneet listaluettelon tasaiseksi luetteloksi onnistuneesti.

Listaluettelon litistäminen Lambda-avainsanalla

Voimme määritellä anonyymin funktion avainsanalla lambda . Voimme välittää säännöllisen/epäsäännöllisen listan parametrina tälle anonyymille funktiolle. Lausekkeen arviointi tehdään tasaisen yksiulotteisen listan saamiseksi.

Tarkastellaanpa seuraavaa esimerkkiä:

Esimerkki:

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

Lähtö:

 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] 

Selitys:

Yllä olevassa esimerkissä olemme määrittäneet sisäkkäisen luettelon. Olemme sitten käyttäneet lambda avainsana sekä argumentti, joka määrittelee luettelon ymmärtämisen lausekkeen. Olemme sitten tulostaneet ne käyttäjille. Tämän seurauksena olemme onnistuneesti muuntaneet kaksiulotteisen epäsäännöllisen luettelon litteäksi listaksi.