logo

Python | Použitie 2D polí/zoznamov správnym spôsobom

Python poskytuje výkonné dátové štruktúry nazývané zoznamy, ktoré môžu ukladať a manipulovať s kolekciami prvkov. Poskytuje tiež mnoho spôsobov, ako vytvoriť 2-rozmerné zoznamy/polia. Je však potrebné poznať rozdiely medzi týmito spôsobmi, pretože môžu spôsobiť komplikácie v kóde, ktoré môže byť veľmi ťažké vysledovať. V tomto článku preskúmame správny spôsob použitia 2D polí/zoznamov v Pythone.

Použitie 2D polí/zoznamov správnym spôsobom

Správne používanie 2D polí/zoznamov zahŕňa pochopenie štruktúry, prístup k prvkom a efektívnu manipuláciu s údajmi v dvojrozmernej mriežke. Pri práci so štruktúrovanými dátami alebo mriežkami môžu byť užitočné 2D polia alebo zoznamy. 2D pole je v podstate zoznam zoznamov, ktorý predstavuje štruktúru podobnú tabuľke s riadkami a stĺpcami.



Vytvorenie 1-D zoznamu

V Pythone si inicializácia kolekcie prvkov v lineárnej sekvencii vyžaduje vytvorenie 1D poľa, čo je základný proces. Hoci Python nemá vstavanú dátovú štruktúru nazývanú „1D pole“, môžeme použiť zoznam, ktorý dokáže dosiahnuť rovnakú funkčnosť. Zoznamy Pythonu sú dynamické a všestranné, vďaka čomu sú vynikajúcou voľbou na reprezentáciu 1D polí. Začnime pohľadom na bežné spôsoby vytvárania 1d poľa veľkosti N inicializovaného s 0s.

Vytvorenie 1D zoznamu pomocou naivných metód

Manuálna inicializácia a vyplnenie zoznamu bez použitia akýchkoľvek pokročilých funkcií alebo konštrukcií v Pythone je známe ako vytváranie 1D zoznamu pomocou naivných metód.

Python3








N>=> 5> ar>=> [>0>]>*>N> print>(ar)>

>

>

Výkon

[0, 0, 0, 0, 0]>

Vytváranie 1D zoznamu pomocou funkcie List Comprehension

Tu násobíme počet riadkov prázdnym zoznamom, a preto je celý zoznam vytvorený s každým prvkom nula.

Python3




N>=> 5> arr>=> [>0> for> i>in> range>(N)]> print>(arr)>

>

prepísanie metódy v jazyku Java

>

Výkon

[0, 0, 0, 0, 0]>

Vytvorenie 2-D zoznamu

Správne používanie 2D polí/zoznamov zahŕňa pochopenie štruktúry, prístup k prvkom a efektívnu manipuláciu s údajmi v dvojrozmernej mriežke. Osvojením si používania 2D polí môžete výrazne zlepšiť svoju schopnosť spracovávať zložité dáta a efektívne vykonávať rôzne operácie.

Vytvorenie 2D zoznamu pomocou Naivná metóda

Tu vynásobíme počet stĺpcov, a tak dostaneme 1-D zoznam veľkosti rovnajúci sa počtu stĺpcov a potom ho vynásobíme počtom riadkov, čo vedie k vytvoreniu 2-D zoznamu.

Python3




rows, cols>=> (>5>,>5>)> arr>=> [[>0>]>*>cols]>*>rows> print>(arr)>

>

>

Výkon

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Poznámka: Použitie tejto metódy môže niekedy spôsobiť neočakávané správanie. Pri tejto metóde bude každý riadok odkazovať na rovnaký stĺpec. To znamená, že aj keď aktualizujeme iba jeden prvok poľa, aktualizuje sa rovnaký stĺpec v našom poli.

Python




rows, cols>=> (>5>,>5>)> arr>=> [[>0>]>*>cols]>*>rows> print>(arr,>'before'>)> arr[>0>][>0>]>=> 1> # update only one element> print>(arr,>'after'>)>

triedenie vkladania java

>

>

Výkon

([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]], 'before') ([[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]], 'after')>

Vytvorenie 1D zoznamu pomocou Porozumenie zoznamu

Tu v podstate používame koncept porozumenia zoznamu a aplikujeme slučku na zoznam vo vnútri zoznamu, čím vytvárame 2-D zoznam.

Python3




rows, cols>=> (>5>,>5>)> arr>=> [[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)]> print>(arr)>

>

>

Výkon

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Vytvorenie 1D zoznamu pomocou Prázdny zoznam

Tu pripájame nuly ako prvky pre niekoľko stĺpcov a potom pridávame tento 1-D zoznam do prázdneho zoznamu riadkov, čím vytvárame 2-D zoznam.

Python3




ako triediť zoznam polí v jave
arr>=>[]> rows, cols>=>5>,>5> for> i>in> range>(rows):> >col>=> []> >for> j>in> range>(cols):> >col.append(>0>)> >arr.append(col)> print>(arr)>

>

>

Výkon

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Inicializuje sa 2D pole

Poskytnutý kód demonštruje dva rôzne prístupy k inicializácii 2D poľa Python . Po prvé, polearr>sa inicializuje pomocou 2D porozumenia zoznamu, kde je každý riadok vytvorený ako[0, 0, 0, 0, 0]>. Celé pole je vytvorené ako zoznam odkazov na rovnaký vnútorný zoznam, výsledkom čoho je aliasing. Akákoľvek zmena vykonaná v prvku v jednom riadku sa prejaví vo všetkých riadkoch. Kód potom ukazuje iný prístup využívajúci pochopenie vnoreného zoznamu na vytvorenie 2D poľaarr>. Táto metóda sa vyhýba aliasingu vytvorením nového zoznamu pre každý riadok, výsledkom čoho je správne 2D pole.

Python3




# Python 3 program to demonstrate working> # of method 1 and method 2.> rows, cols>=> (>5>,>5>)> # method 2 1st approach> arr>=> [[>0>]>*>cols]>*>rows> # lets change the first element of the> # first row to 1 and print the array> arr[>0>][>0>]>=> 1> for> row>in> arr:> >print>(row)> # method 2 2nd approach> arr>=> [[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)]> # again in this new array lets change> # the first element of the first row> # to 1 and print the array> arr[>0>][>0>]>=> 1> for> row>in> arr:> >print>(row)>

>

>

Výkon

[1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [0, 0, 0, 0, 0] [0, 0, 0, 0, 0] [0, 0, 0, 0, 0] [0, 0, 0, 0, 0]>

Vysvetlenie:

Očakávame, že iba prvý prvok prvého riadku sa zmení na 1, ale prvý prvok každého riadku sa zmení na 1 v metóde 2a. Toto zvláštne fungovanie je spôsobené tým, že Python používa plytké zoznamy, ktorým sa budeme snažiť porozumieť.
V metóde 1a Python nevytvára 5 celočíselných objektov, ale vytvára iba jeden celočíselný objekt a všetky indexy poľa arr ukazujú na rovnaký objekt typu int, ako je znázornené.

Ak priradíme 0. index inému celému číslu, povedzme 1, potom sa vytvorí nový celočíselný objekt s hodnotou 1 a potom 0. index teraz ukazuje na tento nový int objekt, ako je znázornené nižšie

Podobne, keď vytvoríme 2d pole ako arr = [[0]*cols]*riadky, v podstate rozširujeme vyššie uvedenú analógiu.

  1. Vytvorí sa iba jeden celočíselný objekt.
  2. Vytvorí sa jeden zoznam 1d a všetky jeho indexy ukazujú na rovnaký objekt int v bode 1.
  3. Teraz, arr[0], arr[1], arr[2] …. arr[n-1] všetky ukazujú na rovnaký objekt zoznamu vyššie v bode 2.

Vyššie uvedené nastavenie je možné vizualizovať na obrázku nižšie.

Teraz zmeňte prvý prvok v prvom riadku arr na arr[0][0] = 1

  • arr[0] ukazuje na jeden objekt zoznamu, ktorý sme vytvorili vyššie. (Pamätajte, že arr[1], arr[2] …arr[n-1] tiež všetky ukazujú na rovnaký objekt zoznamu).
  • Priradenie arr[0][0] vytvorí nový objekt typu int s hodnotou 1 a arr[0][0] bude teraz ukazovať na tento nový objekt typu int. (rovnako ako arr[1][0], arr [2][0] … arr[n-1][0])

To je jasne vidieť na obrázku nižšie.

Takže keď sú takto vytvorené 2d polia, zmena hodnôt v určitom riadku ovplyvní všetky riadky, pretože v podstate existuje iba jeden celočíselný objekt a iba jeden objekt zoznamu, na ktorý odkazujú všetky riadky poľa.

Ako by ste očakávali, vysledovanie chýb spôsobených takýmto používaním plytkých zoznamov je zložité. Preto je lepší spôsob, ako deklarovať 2d pole

Python3




rows, cols>=> (>5>,>5>)> print>([[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)])>

>

>

Výkon

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Táto metóda vytvorí 5 samostatných objektov zoznamu, na rozdiel od metódy 2a. Jedným zo spôsobov, ako to skontrolovať, je použiť operátor „is“, ktorý skontroluje, či dva operandy odkazujú na rovnaký objekt.

Python3




rows, cols>=> (>5>,>5>)> # method 2 2nd approach> arr>=> [[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)]> # check if arr[0] and arr[1] refer to> # the same object> print>(arr[>0>]>is> arr[>1>])># prints False> # method 2 1st approach> arr>=> [[>0>]>*>cols]>*>rows> # check if arr[0] and arr[1] refer to the same object prints True because there is only one> #list object being created.> print>(arr[>0>]>is> arr[>1>])>

koľko miest je v Spojených štátoch amerických
>

>

Výkon

False True>