Bevezetés
A Lista a Python programozási nyelv egyik legrugalmasabb adatstruktúrája. Másrészt a kétdimenziós lista vagy 2D lista, amelyet általában listák listájának neveznek, egy olyan lista objektuma, ahol minden elem maga egy lista. Például: [[19, 18, 17], [16, 15, 14], [13, 12, 11]].
A listák simítása egy kétdimenziós lista egydimenziós listává történő átalakításának folyamata a listák listájában lévő összes listaelem beágyazásának megszüntetésével, vagyis a [[9, 8, 7], [6 , 5, 4], [3, 2, 1]] - [9, 8, 7, 6, 5, 4, 3, 2, 1].
A lapítási folyamatot a beágyazott segítségével tudjuk elvégezni számára ciklusok, rekurzió, listamegértések, alapfunkciók, vagy a Pythonban lévő könyvtárak vagy csomagok importálása a beágyazott listák mélysége és szabályossága alapján.
Ebben az oktatóanyagban különféle módszereket dolgozunk ki a beágyazott listák egyesítésére a Python programozási nyelv használatával. Mielőtt azonban elkezdenénk, ismerjük meg a beágyazott listák típusait.
Melyek a beágyazott listák típusai?
Mint tudjuk, Piton egy gyengén tipizált programozási nyelv. Ezért kétféle listával találkozhatunk. Ezek a listák vagy beágyazott listák a következők:
- Listák szokásos listája
- Rendhagyó listák listája
Rendszeres listák listája
A listák reguláris listájában minden elemet Allistának nevezünk, így figyelve az elem típusának egységességét. Például: [[9, 8, 7], [6, 5, 4], [3, 2, 1]] a [9, 8, 7], [6, 5, 4] listák szokásos listája. , [3, 2, 1] lista típusú.
Rendhagyó listák listája
rendszer szoftver
A listák szabálytalan listájában minden elemet allistaként vagy nem listás elemként (például karakterláncként vagy egész számként) neveznek. Így az elem típusát illetően szabálytalanság van. Például: [[9, 8, 7], [6, 5], 4, 3] a listák szabálytalan listája, mivel a [9, 8, 7] és a [6, 5] listatípusok, míg a 4 3 pedig int típusú.
A listák listájának simítása a Nested for Loops segítségével
A listák listájának simítása a beágyazott elemekkel számára A Loops segítsége brute force megközelítésnek számít egy lapos lista eléréséhez. Ezt a módszert úgy hajthatjuk végre, hogy minden elemet kiválasztunk a Kétdimenziós listából, és egydimenziós listába rendezzük.
Tekintsük a következő példát, amely mind a normál, mind a nem szabályos listák esetében működik.
Példa:
# 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))
Kimenet:
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]
Magyarázat:
A fenti példában egy függvényt definiáltunk így flattenlist amely olyan paramétert vesz fel, mint _2dlist . Akkor használtuk számára ciklust a beágyazott lista elemeinek iterálásához és hozzáfűzéséhez egy lapított lista létrehozásához. Ezután meghatároztuk a beágyazott listát, és megvalósítottuk a flattenlist funkció. Ennek eredményeként a beágyazott lista sikeresen átalakult lapos listává.
A beágyazott lista kiegyenlítése listaértelmezés segítségével
A listák listájának egyengetése a listaértés segítségével elegáns megközelítésnek tekinthető egy lapos lista létrehozásához, amely egy kétdimenziós létező listától függ. Ez a megközelítés azonban kevésbé intuitív megoldást kínál.
Tekintsük a következő példát.
Példa:
# 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)
Kimenet:
Genuine list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90]
Magyarázat:
A fenti példában egy beágyazott listát és listaértelmezést határoztunk meg. Ezt követően kinyomtattuk őket a felhasználók számára. Ennek eredményeként a beágyazott lista sikeresen átalakult lapos listává.
A listák listájának simítása rekurzív módszerrel
Használhatjuk a rekurzív módszert is a kétdimenziós lista egyengetésére. Tekintsük a következő példát a rekurzív metódus megvalósítására a listák listájának simítása érdekében. Ez a megvalósítás jól működik normál és szabálytalan listák esetén is.
Példa:
# 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]))
Kimenet:
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
Magyarázat:
A fenti példában definiáltunk egy függvényt és használtunk egy ha nyilatkozat kimondja, ha a beágyazott lista hossza nulla, akkor adja vissza a beágyazott listát.
hackelés feldolgozás
Ha a nulladik index adateleme egy lista példánya, akkor a listaindex ismét bemegy a függvénybe, és hozzáadódik a lista következő indexéhez és így tovább. Ellenkező esetben a függvény visszaadja az elemeket és így tovább. Végül meghatároztuk a beágyazott listát és végrehajtottuk a függvényt. Ennek eredményeként a listák listája rekurzívan ellaposodott.
Python könyvtárak használata
Használhatunk néhány Python programozási nyelvi könyvtárat is a listák listájának simítására. Ezeknek a könyvtáraknak a megvalósítását az alábbiakban ismertetjük:
A listák listájának simítása a függvényeszközök és operátorkönyvtárak segítségével
A operátor könyvtár biztosítja a ikonmacska() függvény az alapvető műveletek, például az összefűzés végrehajtásához. Ezt a függvényt kumulatívan alkalmazhatjuk egy beágyazott lista adatelemeire, balról jobbra, aminek eredményeként a beágyazott lista lapos listává redukálható.
Tekintsük a következő példát, hogy megértsük a megvalósítását.
Példa:
# 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, []))
Kimenet:
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]
Magyarázat:
A fenti példában importáltuk a funkcionális eszközök könyvtárral együtt a operátor könyvtár. Ezután egy üres listát definiáltunk a rendszeres lista . Ezután definiáltunk egy függvényt, mint convo a listák listájának lapított listává alakításához. Ebben a függvényben a számára ciklus, ahol a beágyazott lista elemei hozzáfűződnek a korábban definiált üres listához. Később definiáltuk a beágyazott listát és végrehajtottuk a függvényt. Ennek eredményeként a listák listája sikeresen simított listává alakul.
A listák listájának simítása az itertools könyvtár használatával
A itertools könyvtár biztosítja a lánc() függvény, amellyel ideális esetben egy beágyazott listát egyetlen lapított listává alakíthatunk át. Ez a függvény az egymást követő sorozatokat egyetlen sorozatként kezeli úgy, hogy a paraméterként átadott iterálható soros módon iterálja őket.
Tekintsük a következő példát:
bináris keresés algoritmusa
Példa:
# 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
Kimenet:
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]
Magyarázat:
A fenti példában importáltuk a itertools könyvtárat, és létrehozott egy beágyazott listát. Ezután használtuk a lánc() függvényt az adott beágyazott lista lapos listává alakításához. Végre visszaküldtük az eredményt a felhasználóknak. Ennek eredményeként a listák listája sikeresen kiegyenlítésre került.
A listák listájának egyengetése a NumPy könyvtár használatával
A NumPy A könyvtár különféle mindennapi műveleteket biztosít, beleértve a kétdimenziós szabályos tömbök oszloponkénti vagy soronkénti összefűzését. A néven ismert attribútumot fogjuk használni lakás annak érdekében, hogy egy egydimenziós iterátort kapjon a tömbön, hogy meghódítsa a célt. Tekintsük a következő példát, hogy megértsük az összefűzés függvény és a flat attribútum használatát.
Példa:
# 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)
Kimenet:
The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90]
Magyarázat:
A fenti példában importáltuk a zsibbadt könyvtárat, és definiált egy beágyazott listát. Ezután használtuk a összekapcsol funkciója zsibbadt könyvtárat a vele együtt lakás attribútumot a beágyazott lista elemeinek egyesítéséhez, és összefűzéséhez egy új lapos listához. Végre kinyomtattuk az eredményt a felhasználók számára. Így a listák listája sikeresen simított.
Az alapfunkciók használata
A simítási feladatot a Python programozási nyelv által biztosított néhány alapvető funkció felhasználásával is elvégezhetjük.
A listák listájának egyengetése az összeg függvény segítségével
A probléma másik megoldásának tekinthetjük a belső listák összegzését. Két érvet adunk át a összeg függvény: Az első paraméter az iterálható , amely egy beágyazott lista, a második paraméter pedig Rajt amely egy üres lista a következő esethez, amely a kezdeti lapos listaként szolgál, ahol a belső allisták adatelemei hozzáadódnak.
Azt mondhatjuk, hogy ez a megközelítés meglehetősen kényelmes, mivel nem kell semmit importálnunk. Ez azonban lassabb, mint a itertools() és lánc() akkor működik, ha nagyszámú allista van a beágyazott listában.
adatkapcsolati réteg protokollok
Tekintsük a következő példát:
Példa:
# 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)
Kimenet:
The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90]
Magyarázat:
A fenti példában definiáltuk a beágyazott listát. Ezután használtuk a összeg() függvényt, és a beágyazott listát egydimenziós listává simította, és az eredményül kapott listát kinyomtatta a felhasználók számára. Ennek eredményeként a listák listáját sikeresen egységes listává alakítottuk.
A listák listájának simítása Lambda kulcsszó használatával
A kulcsszó használatával anonim függvényt definiálhatunk lambda . Ennek az anonim függvénynek paraméterként átadhatjuk a reguláris/irreguláris listát. A kifejezés kiértékelése egy lapos egydimenziós lista létrehozása érdekében történik.
Tekintsük a következő példát:
Példa:
# 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))
Kimenet:
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]
Magyarázat:
A fenti példában egy beágyazott listát definiáltunk. Ezután használtuk a lambda kulcsszó, valamint egy argumentum, amely a lista megértéséhez szükséges kifejezést határozza meg. Ezt követően kinyomtattuk őket a felhasználók számára. Ennek eredményeként sikeresen konvertáltuk a kétdimenziós szabálytalan listát lapított listává.