logo

Python | Pravilna uporaba 2D nizov/seznamov

Python zagotavlja zmogljive podatkovne strukture, imenovane seznami, ki lahko shranjujejo in upravljajo zbirke elementov. Ponuja tudi številne načine za ustvarjanje 2-dimenzionalnih seznamov/matrik. Vendar je treba poznati razlike med temi načini, ker lahko povzročijo zaplete v kodi, ki jih je zelo težko izslediti. V tem članku bomo raziskali pravi način uporabe 2D nizov/seznamov v Pythonu.

Pravilna uporaba 2D nizov/seznamov

Pravilna uporaba 2D nizov/seznamov vključuje razumevanje strukture, dostop do elementov in učinkovito manipuliranje s podatki v dvodimenzionalni mreži. Pri delu s strukturiranimi podatki ali mrežami so lahko koristni 2D nizi ali seznami. 2D niz je v bistvu seznam seznamov, ki predstavlja tabeli podobno strukturo z vrsticami in stolpci.



Ustvarjanje 1-D seznama

V Pythonu inicializacija zbirke elementov v linearnem zaporedju zahteva ustvarjanje 1D niza, kar je temeljni postopek. Čeprav Python nima vgrajene podatkovne strukture, imenovane '1D array', lahko uporabimo seznam, ki lahko doseže enako funkcionalnost. Seznami Python so dinamični in vsestranski, zaradi česar so odlična izbira za predstavitev 1D nizov. Začnimo z ogledom običajnih načinov ustvarjanja 1d niza velikosti N, ki je inicializiran z 0s.

Ustvarjanje 1D seznama z uporabo naivnih metod

Ročno inicializiranje in polnjenje seznama brez uporabe naprednih funkcij ali konstrukcij v Pythonu je znano kot ustvarjanje 1D seznama z uporabo naivnih metod.

Python3








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

>

>

Izhod

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

Ustvarjanje 1D seznama z uporabo seznama Comprehension

Tukaj pomnožimo število vrstic s praznim seznamom in tako je celoten seznam ustvarjen z vsakim elementom nič.

Python3




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

>

>

Izhod

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

Ustvarjanje 2-D seznama

Pravilna uporaba 2D nizov/seznamov vključuje razumevanje strukture, dostop do elementov in učinkovito manipuliranje s podatki v dvodimenzionalni mreži. Z obvladovanjem uporabe 2D nizov lahko občutno izboljšate svojo sposobnost ravnanja s kompleksnimi podatki in učinkovitega izvajanja različnih operacij.

Ustvarjanje 2D seznama z uporabo Naivna metoda

Tukaj pomnožimo število stolpcev in tako dobimo 1-D seznam velikosti, ki je enaka številu stolpcev, nato pa ga pomnožimo s številom vrstic, kar ima za posledico ustvarjanje 2-D seznama.

Python3




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

>

>

Izhod

[[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]]>

Opomba: Uporaba te metode lahko včasih povzroči nepričakovano vedenje. Pri tej metodi se bo vsaka vrstica sklicevala na isti stolpec. To pomeni, da bo posodobil isti stolpec v naši matriki, tudi če posodobimo samo en element matrike.

Python




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

>

>

Izhod

([[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')>

Ustvarjanje 1D seznama z uporabo Razumevanje seznama

Tukaj v bistvu uporabljamo koncept razumevanja seznama in uporabljamo zanko za seznam znotraj seznama in s tem ustvarjamo 2-D seznam.

Python3


enako metoda v Javi



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

>

>

Izhod

[[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]]>

Ustvarjanje 1D seznama z uporabo Prazen seznam

Tukaj dodajamo ničle kot elemente za več stolpcev in nato ta 1-D seznam dodajamo v prazen seznam vrstic in tako ustvarjamo 2-D seznam.

Python3




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

>

>

Izhod

[[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]]>

Inicializacija 2D polja

Priložena koda prikazuje dva različna pristopa za inicializacijo 2D niza v Python . Prvič, nizarr>se inicializira z 2D razumevanjem seznama, kjer je vsaka vrstica ustvarjena kot[0, 0, 0, 0, 0]>. Celotno polje je ustvarjeno kot seznam referenc na isti notranji seznam, kar ima za posledico vzdevek. Vsaka sprememba elementa v eni vrstici se bo odražala v vseh vrsticah. Koda nato prikaže drug pristop z uporabo razumevanja ugnezdenega seznama za ustvarjanje 2D nizaarr>. Ta metoda se izogne ​​vzdevkom z ustvarjanjem novega seznama za vsako vrstico, kar ima za posledico pravilno 2D matriko.

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

>

>

Izhod

[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]>

Pojasnilo:

Pričakujemo, da se bo samo prvi element prve vrstice spremenil v 1, vendar se prvi element vsake vrstice spremeni v 1 pri metodi 2a. To nenavadno delovanje je zato, ker Python uporablja plitke sezname, ki jih bomo poskušali razumeti.
Pri metodi 1a Python ne ustvari 5 celoštevilskih objektov, ampak ustvari samo en celoštevilski objekt in vsi indeksi matrike arr kažejo na isti int objekt, kot je prikazano.

Če 0. indeks dodelimo drugemu celemu številu, recimo 1, se ustvari nov celoštevilski objekt z vrednostjo 1 in nato 0. indeks zdaj kaže na ta novi int objekt, kot je prikazano spodaj

Podobno, ko ustvarimo 2d matriko kot arr = [[0]*cols]*rows, v bistvu razširimo zgornjo analogijo.

  1. Ustvari se samo en celoštevilski objekt.
  2. Ustvari se en sam seznam 1d in vsi njegovi indeksi kažejo na isti int objekt v točki 1.
  3. Zdaj, arr[0], arr[1], arr[2] …. arr[n-1] vsi kažejo na isti predmet seznama zgoraj v točki 2.

Zgornjo postavitev si lahko vizualizirate na spodnji sliki.

Zdaj pa spremenimo prvi element v prvi vrstici arr kot arr[0][0] = 1

  • arr[0] kaže na en sam objekt seznama, ki smo ga ustvarili zgoraj. (Ne pozabite, arr[1], arr[2] ... arr[n-1] vsi kažejo tudi na isti objekt seznama).
  • Dodelitev arr[0][0] bo ustvarila nov int objekt z vrednostjo 1 in arr[0][0] bo zdaj pokazal na ta novi int objekt. (in tako tudi arr[1][0], arr [2][0] … arr[n-1][0])

To je jasno razvidno iz spodnje slike.

Torej, ko so matrike 2d ustvarjene na ta način, bo spreminjanje vrednosti v določeni vrstici vplivalo na vse vrstice, saj v bistvu obstaja samo en celoštevilski objekt in samo en predmet seznama, na katerega se sklicujejo vse vrstice matrike.

Kot bi pričakovali, je težko izslediti napake, ki jih povzroči taka uporaba plitkih seznamov. Zato je boljši način za deklaracijo 2d matrike

Python3




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

>

>

Izhod

[[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]]>

Ta metoda ustvari 5 ločenih objektov seznama, za razliko od metode 2a. Eden od načinov za preverjanje tega je uporaba operatorja 'is', ki preveri, ali se oba operanda nanašata na isti objekt.

ali lahko razred razširi več razredov

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

>

>

Izhod

False True>