Sąrašas - „list“ - leidžia saugoti reikšmių eilę. Vietoje to, kad rašytume programą su daug kintamųjų, galime turėti sąrašą x
ir pasiekti jo elementus pagal numerius: x[0]
, x[1]
, x[2]
ir t.t. (Numeriai nurodomi laužtiniuose skliaustuose.) Numerį galima nurodyti, naudojant kintamąjį, pvz, x[i]
ir x[i+1]
. Tai leidžia, ciklų pagalba, tvarkyti didelius duomenų kiekius.
O kaip sukurti sąrašą?
myList = [101, 2014, 4.5] # reikšmės išvardinamos tarp laužtinių skliaustų (atskirtos kableliais)Tai sukuria sąrašą
myList
. Sąraše yra 3 elementai/nariai. Kiekvienas sąrašo elementas turi savo numerį (indeksą): pirmojo elemento indeksas visada yra 0, antro elemento - 1, trečio - 2 ir t.t. Sąrašo elementai yra kaip kintamieji - jie pasiekiami:
«sarasoVardas»[«eilNr»]
Mūsų pavyzdyje, myList[0]
yra kintamasis, kurio reikšmė yra 100
, o print(myList[2])
atspausdintų 4.5
.
Dažnai reikia sąrašą papildyti palaipsniui: tam naudojama sąrašo komanda (metodas) append( )
, pavyzdžiui:
Sąrašuose galima keisti bei pašalinti elementus (pagal numerį).
Kaip matote, numbers[0]
reikšmė buvo pakeista (kaip ir bet kokio kintamojo).
Pabandykite nuspėti galutinę žemiau esančio pavyzdžio situaciją, o tada palyginkite savo spėjimą su rezultatu...
stuff = [2, 25, 80, 12] stuff[stuff[0]] = stuff[3] print(stuff)
stuff[3]
reikšmė yra 12
. Kairiojoje pusėje esančio stuff[0]
reikšmė yra 2
, taigi, įstačius, stuff[stuff[0]]
atitinka stuff[2]
. Šio kintamojo reikšmė yra pakeičiama (iš 80
) į 12
.Tai, ką Pitone vadiname list (sąrašu), kitose programavimo kalbose dažniausiai vadinama array (masyvu). Pitone taip pat yra array - naudojamas vienodo tipo reikšmėms saugoti (bet tik skaičiams arba simboliams). Tuo tarpu įprastame sąraše (list) vienu metu gali būti skaičiai, žodžiai ir bet kokios kitos reikšmės. |
Dažniausiai pasitaikančios klaidos
Jei nurodysite per didelį elemento numerį, bus klaida:
Aukščiau esančiame pavyzdyje myList
turi 4 elementus. Pirmojo numeris yra 0, paskutiniojo - 3. Nurodę 4, 5 ar bet kurį didesnį skaičių, gausime klaidą.
Naudingos operacijos
Sąrašo ilgis: len(«list»).
Pavyzdyje len(«list») yra naudojamas kartu su range()
elementų numeriams išvardinti.
Prisiminkime, kad range(«pradžia», «pabaiga») generuoja seką nuo «pradžia» iki «pabaiga»-1 (t.y. pabaiga naudojama neimtinai).
Pabandykite naudoti len
sąrašo viduriui rasti:
Ar sąrašai yra panašūs į teksto eilutes (string)?
Tikrai taip! Tekstas yra tarsi simbolių sąrašas. Abiems naudojama len()
funkcija bei elementų numeriai X[«nr»]
. Abu jie yra numeruojamo tipo duomenys (angl. "sequence types"). BET, tekste simboliai negali būti keičiami pagal eil. nr.
Dėl šios priežasties sąrašai yra vadinami "mutable" (kintančių elementų), o teksto eilutės - "immutable" (nekintančių elementų) tipo sekom. Daugiau apie tai --17-toje pamokoje..
Sąrašų sudėtis ir padauginimas
Iš pamokos apie strint
tipą, prisimename, kad yra įmanoma naudoti +
ženklą dviejų tekstų sujungimui. Tą patį galima daryti ir su sąrašais.
Panašiai, galime naudoti daugybą*
, kad padaugintume sąrašą (išvardintume jo elementus kelis kartus). Taip patogu sukurti norimo ilgio sąrašą.
Norėdami išspręsti tolimesnį uždavinį, panaudokite vieną iš parodytų veiksmų ir for
ciklą.
Eilutės pabaiga ir neigiami elementų numeriai (indeksai)
Norėdami gauti paskutinį sąrašo elementą, naudokite
«sarasas»[-1]
L[-k]
grąžina k
-tąjį lementą nuo sąrašo pabaigos. Pitonas šią išraišką paverčia į L[len(L)-k]
. Šis trumpinys veikia ir su tekstu!
max
irsum
Funkcija max
, kaip matėme anksčiau, gražina didžiausią skaičių sąraše. Panašiai, funkcija sum(L)
grąžina sąraše L
esančių elementų sumą.
Sąrašo perrinkimas
„for“ ciklo tikslesnė reikšmė angliškai būtų "for each" - jis iš eilės paima kiekvieną sąrašo reikšmę (prisiminkite 7c pamoką):
for x in Sar: «veiksmai, naudojantys x»Pirmiausia
x
-ui yra priskiriama pirmoji Sar
reikšmė ir atliekami veiksmai; tada x
-ui yra priskiriama antroji Sar
reikšmė ir atliekami veiksmai. Ir t.t. visiems elementams. Senesnės programavimo kalbos (C, Paskalis) šios savybės neturi, jose reikia naudoti indeksus. Bet taip užrašyti patogiau - palyginkite, kaip atrodo su indeksais - papildomai „apkraunamas“ kodas:
for i in range(len(Sar)): # range() duoda seką nuo 0 iki sąrašo paskutinio elemento x = Sar[i] «veiksmai, naudojantys x»Indeksai reikalingi tik tada, jei reikia pakeisti sąrašo elementus, tačiau tai būna ne itin dažnai (bei patogumui dažnai naudojama "enumerate()" funkcija).
Štai vaizdingas sąrašo reikšmių perrinkimo ir atspausdinimo pavyzdys.
"For each" ciklai yra tinkami ir tekstui: pabandykite for char in "hello"
.
Puiku! Galite keliauti į kitą pamoką, arba pabandyti papildomą užduotį.
x
reikšme mystery(x)
patektų į nesibaigiantį ciklą?
def mystery(x): a = [0, 4, 0, 3, 2] while x > 0: x = a[x] return "Done"
Rikiavimas bei paieška sąraše
Tvarkant duomenis, rikiavimas ir paieška yra vieni svarbiausių/dažniausių veiksmų.
Paiešką galima atlikti, naudojant perrinkimą, pvz:
Tačiau Python leidžia tai užrašyti trumpiau - kaip sąlygą «ieskoma» in «Sar»
, kuri grąžins True/False:
Naudojant komandą index()
, galima sužinoti, kurioje vietoje (kelintas) sąraše yra ieškomas elementas:
Naudojant komandą count( )
, galima sužinoti, kiek kartų tam tikra reikšmė kartojasi sąraše.
Sąrašų rikiavimas yra plati programavimo tema (tam reikia naudoti ciklą cikle), bet Python turi paruoštus algoritmus, kurie iškviečiami viena eilute:
Matricos - sąrašai iš sąrašų
Dažnai duomenų saugojimui ir analizei naudojamos matricos (lentelės). Tai yra tiesiog sąrašas iš sąrašų:
Kad geriau suprastumėte, išbandykite pavyzdį su "veiksmų sekimu" ;).
Kaip matome, matricą patogu nagrinėti eilutėmis. Bet kurią eilutę galima pasiekti pagal numerį: Pazymiai[0]
, Pazymiai[1]
ir t.t. O eilutėje galima pasiekti bet kurį jos elementą, pvz., Pazymiai[2][0]
yra reikšmė "Antanas"
.
Žodynai (dictionary)
Kita dažnai praverčianti duomenų struktūra yra žodynai ("dictionary") -- kitose kalbose vadinami atvaizdavimais ("map"). Juose reikšmės saugomos susietos poromis - pagal raktą (angl. "key") galima sužinoti jam priskirtą reikšmę (angl. "value") - kaip ir tikram žodyne. Programos kintamuosius Pythone irgi galima pasiekti kaip žodynus -- naudojant komandas locals() ir globals(). Žodyno poros išvardinamos tarp riestinių skliaustų { }
, o pora susiejama dvitaškiu, pvz
asmens_info = {"vardas":"Petras", "miestas":"NewYork", "amzius":21 }Žodyne reikšmės saugomos ne iš eilės, o Python'ui patogia tvarka - kad galėtų kuo greičiau rasti reikšmę pagal nurodytą raktą. Žodyne naujo reikšmės (rakto) pridėjimas atrodo taip pat, kaip jau esančio pakeitimas, pvz:
asmens_info["turtas"] = 99000 asmens_info["miestas"] = "Kaunas"
Kad geriau suprastumėte, siūlome naudoti "veiksmų sekimą".
Sąrašas iš žodynų (panašiai, kaip matrica) gali būt naudojamas duomenų bazės informacijai saugoti/pateikti (raktus naudojant kaip stulpelių pavadinimus) - taip elgiasi NoSQL duombazės (kai nėra fiksuotos lentelių struktūros). O rimtiems duomenų tvarkymams dabar dažniausiai naudojamas Pandas paketas.
Interneto svetainėse siunčiami duomenys dažnai koduojami JSON formatu - jame naudojami sąrašai ir žodynai, kurie atrodo analogiškai kaip Python'e.
Aibės (set)
Aibės šiek tiek panašios į žodynus -- jose nesvarbi eilės tvarka ir kiekvienas elementas yra paminėtas tik vieną kartą. Su jom galima atlikti matematinius aibių sankirtos, sąjungos ir skirtumo veiksmus
A = set('abracadabra') # set(['a', 'r', 'b', 'c', 'd']) B = set('alacazam') # set(['a', 'l', 'c', 'z', 'm']) A & B # set(['a', 'c']) -- sankirta (elementai, kurie yra abiejose aibėse) A - B # set(['r', 'd', 'b']) -- skirtumas A | B # set(['a', 'c', 'b', 'd', 'm', 'l', 'r', 'z']) -- sąjunga (visi elementai iš abiejų aibių)
Patogios smulkmenos duomenų struktūroms
Įv. duomenų perrinkimas yra dažna užduotis, todėl Python'e yra pasistengta, kad tai būtų galima kuo trumpiau ir aiškiau užrašyti.