logo

Python | Tinkamas 2D matricų / sąrašų naudojimas

Python pateikia galingas duomenų struktūras, vadinamas sąrašais, kuriose galima saugoti ir valdyti elementų rinkinius. Taip pat pateikiama daug būdų, kaip sukurti dvimačius sąrašus / masyvus. Tačiau reikia žinoti šių būdų skirtumus, nes jie gali sukelti kodo komplikacijų, kurias gali būti labai sunku atsekti. Šiame straipsnyje mes išnagrinėsime tinkamą 2D masyvų / sąrašų naudojimo Python būdą.

Tinkamas 2D matricų / sąrašų naudojimas

Tinkamas 2D matricų / sąrašų naudojimas apima struktūros supratimą, prieigą prie elementų ir efektyvų duomenų apdorojimą dvimatėje tinklelyje. Dirbant su struktūriniais duomenimis arba tinkleliais, gali būti naudingi 2D matricos arba sąrašai. 2D masyvas iš esmės yra sąrašų sąrašas, vaizduojantis į lentelę panašią struktūrą su eilėmis ir stulpeliais.



1-D sąrašo kūrimas

„Python“ sistemoje norint inicijuoti elementų rinkinį tiesine seka, reikia sukurti 1D masyvą, o tai yra pagrindinis procesas. Nors „Python“ neturi integruotos duomenų struktūros, vadinamos „1D masyvu“, galime naudoti sąrašą, kuris gali pasiekti tas pačias funkcijas. Python sąrašai yra dinamiški ir universalūs, todėl jie yra puikus pasirinkimas vaizduojant 1D masyvus. Pradėkime nuo įprastų būdų, kaip sukurti 1d N dydžio masyvą, inicijuotą 0s.

1D sąrašo kūrimas naudojant naivius metodus

Rankinis sąrašo inicijavimas ir pildymas nenaudojant jokių išplėstinių Python funkcijų ar konstrukcijų yra žinomas kaip 1D sąrašo kūrimas naudojant naivius metodus.

Python3








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

>

>

Išvestis

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

1D sąrašo kūrimas naudojant sąrašo supratimą

Čia mes padauginame eilučių skaičių iš tuščio sąrašo, todėl visas sąrašas sukuriamas su kiekvienu elementu nuliu.

Python3




preg_match

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

>

>

Išvestis

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

2D sąrašo kūrimas

Tinkamas 2D matricų / sąrašų naudojimas apima struktūros supratimą, prieigą prie elementų ir efektyvų duomenų apdorojimą dvimatėje tinklelyje. Įvaldę 2D masyvų naudojimą, galite žymiai pagerinti savo gebėjimą tvarkyti sudėtingus duomenis ir efektyviai atlikti įvairias operacijas.

2D sąrašo kūrimas naudojant Naivus metodas

Čia mes padauginame stulpelių skaičių ir gauname 1-D sąrašą, kurio dydis yra lygus stulpelių skaičiui, o tada padauginame jį iš eilučių skaičiaus, todėl sukuriamas 2-D sąrašas.

Python3




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

>

>

Išvestis

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

Pastaba: Šio metodo naudojimas kartais gali sukelti netikėtą elgesį. Taikant šį metodą, kiekviena eilutė bus nuoroda į tą patį stulpelį. Tai reiškia, kad net jei atnaujinsime tik vieną masyvo elementą, jis atnaujins tą patį stulpelį mūsų masyve.

Python




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

>

>

Išvestis

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

1D sąrašo kūrimas naudojant Sąrašo supratimas

Čia mes iš esmės naudojame sąrašo supratimo sąvoką ir sąrašo viduje taikome kilpą, taigi sukuriame 2-D sąrašą.

Python3




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

>

>

'prim's algoritmas'

Išvestis

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

1D sąrašo kūrimas naudojant Tuščias sąrašas

Čia mes pridedame nulius kaip elementus stulpelių skaičiui kartų, tada pridedame šį 1-D sąrašą į tuščių eilučių sąrašą ir taip sukuriame 2-D sąrašą.

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

>

>

Išvestis

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

Inicijuojamas 2D masyvas

Pateiktas kodas parodo du skirtingus būdus, kaip inicijuoti 2D masyvą Python . Pirma, masyvasarr>inicijuojamas naudojant 2D sąrašo supratimą, kai kiekviena eilutė sukuriama kaip[0, 0, 0, 0, 0]>. Visas masyvas sukuriamas kaip nuorodų į tą patį vidinį sąrašą sąrašas, todėl atsiranda slapyvardis. Bet koks elemento pakeitimas vienoje eilutėje atsispindės visose eilutėse. Tada kodas parodo kitą metodą, naudojant įdėto sąrašo supratimą, kad būtų sukurtas 2D masyvasarr>. Šiuo metodu išvengiama slapyvardžio, nes kiekvienai eilutei sukuriamas naujas sąrašas, todėl gaunamas tinkamas 2D masyvas.

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

>

>

Išvestis

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

Paaiškinimas:

Tikimės, kad tik pirmasis pirmosios eilutės elementas pasikeis į 1, bet pirmasis kiekvienos eilutės elementas bus pakeistas į 1 pagal 2a metodą. Šis savotiškas veikimas yra todėl, kad Python naudoja seklius sąrašus, kuriuos mes stengsimės suprasti.
Taikant 1a metodą, Python nesukuria 5 sveikųjų skaičių objektų, o sukuria tik vieną sveikųjų skaičių objektą, o visi masyvo arr indeksai nurodo tą patį int objektą, kaip parodyta.

Jei 0-ąjį indeksą priskirsime kitam sveikajam skaičiui, tarkime 1, tada sukuriamas naujas sveikojo skaičiaus objektas, kurio reikšmė yra 1, o tada 0-asis indeksas dabar nurodo šį naują int objektą, kaip parodyta toliau.

Panašiai, kai sukuriame 2d masyvą kaip arr = [[0]*cols]*rows, iš esmės išplečiame aukščiau pateiktą analogiją.

  1. Sukuriamas tik vienas sveikųjų skaičių objektas.
  2. Sukuriamas vienas 1d sąrašas ir visi jo indeksai nurodo tą patį int objektą 1 taške.
  3. Dabar, arr[0], arr[1], arr[2] …. arr[n-1] visi nurodo tą patį sąrašo objektą aukščiau 2 punkte.

Aukščiau pateiktą sąranką galima pavaizduoti toliau pateiktame paveikslėlyje.

Dabar pakeiskime pirmąjį elementą pirmoje arr eilutėje kaip arr[0][0] = 1

  • arr[0] nurodo vieną sąrašo objektą, kurį sukūrėme aukščiau. (Atminkite, arr[1], arr[2] …arr[n-1] taip pat nurodo į tą patį sąrašo objektą).
  • Arr[0][0] priskyrimas sukurs naują int objektą su reikšme 1, o arr[0][0] dabar nurodys šį naują int objektą. (taip pat bus arr[1][0], arr [2][0] … arr[n-1][0])

Tai galima aiškiai matyti žemiau esančiame paveikslėlyje.

Taigi, kai taip sukuriami 2d masyvai, tam tikros eilutės reikšmių keitimas paveiks visas eilutes, nes visose masyvo eilutėse nurodomas tik vienas sveikojo skaičiaus objektas ir tik vienas sąrašo objektas.

Kaip ir galima tikėtis, sunku atsekti klaidas, atsirandančias dėl tokio sekliųjų sąrašų naudojimo. Taigi geresnis būdas deklaruoti 2d masyvą yra

Python3




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

>

>

Išvestis

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

Šis metodas sukuria 5 atskirus sąrašo objektus, skirtingai nei 2a metodas. Vienas iš būdų tai patikrinti yra naudoti operatorių „is“, kuris patikrina, ar abu operandai nurodo tą patį 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>])>

>

>

Išvestis

False True>