Naloga iz seznamov in nizov - kamelja pisava

Naloga iz seznamov in nizov - kamelja pisava

Avtor: Svetlana Novak

Učni cilji: Dijak se nauči uporabljati funkcije in metode za delo z nizi v programskem jeziku Python.

Nizi - uvod

Potrebno predznanje:

  • kaj so nizi in kako jih zapisujemo (uporaba narekovajev)
  • seznami in metode za delo s seznami
  • branje nizov: uporaba funkcije input()
  • dolžina niza: funkcija len()
  • indeksiranje znakov v nizu
  • primerjava nizov
  • funkcije: ustvarjanje novih in klicanje

Nizi - rezanje (slicing)

Pri nizih ne moremo spreminjati vsebine elementov na posameznem indeksu (položaju v nizu), čeprav so nizi seznami. Indeksiranje se pri nizi tudi začne z indeksom 0. nekineki

Niz je nespremenljiv, kar pomeni, da spodnji primer ni dovoljen:



niz = 'andrej'
niz[0]= 'A'    # prevajalnik javi napako


(Slice.JPG)
Slika 1: Napaka



Lahko pa ga spreminjamo na drug način - z rezanjem in sestavljanjem v novi niz:

niz = 'andrej'
niz= 'A' + niz[1:] + "a"


Obračanje niza:

>>> beseda = "Ni konj"
>>> obrnjenaBeseda = beseda[::-1]
>>> obrnjenaBeseda
'jnok iN'
>>> beseda
'Ni konj'

Nizi - rezanje: razlika med nizi in seznami

Če so nizi nespremenljivi, kako lahko sestavljamo nize (dodajamo nove nize k obstoječim)? Kadar nespremenljiv razred podpira operator sestavljanja, to stori tako, da vrne nov objekt.


>>> l = k = [1, 2]
>>> k = k + [3]
>>> l
[1, 2, 3]
>>> k
[1, 2, 3]
>>>
>>> a = b = "Ana"
>>> b = b + "Marija"
>>> a
'Ana'
>>> b
'AnaMarija'

Do razlike pride, ker je seznam spremenljiv, zato k = k + [3] pripne nov seznam k obstoječemu seznamu. Čeprav smo [3] pripeli h k, se je spremenil tudi l, ker gre še vedno za en in isti objekt. Z nizi pa je drugače. Niza b ni mogoče spreminjati, zato prištevanje naredi nov niz, a pa še vedno obdrži staro vrednost.



Nizi - rezanje: zgled

Uporaba:

Naloga: Napišite ukaze, pri katerih na začetku vpišete niz, ki predstavlja EMŠO, in nam izpiše datum, mesec in leto rojstva osebe.

Rešitev:

Prvi približek rešitve je trivialen. Prvi dve črki predstavljata dan, drugi dve mesec, tretji dve leto.


emso = input("Vpišite EMŠO osebe: \")
dan = emso[:2]             # režemo 1 in drugi znak
mesec = emso[2:4]          # režemo tretji in četrti znak
leto = ("2" if emso[4]=="0" else "1") + emso[4:7]
                           # uporabimo pogojni izraz, ki doda pred letnico "2", če je peti znak "0",
                           # sicer doda "1", režemo pa od petega do sedmega znaka

Nizi - list

Funkcija list naredi seznam iz niza znakov oz. niz pretvori v tip seznam. Elementi seznama so posamezni znaki iz niza. Nizi so seznami, vendar jim vrednosti ni dovoljeno spreminjati na način, na kateri spreminjamo vrednosti elementov seznama: elementu z indeksom priredimo novo vrednost. Pri nizih tako uporabimo rezanje, ki lahko sledi funkciji list nad nizi ali pa režemo brez uporabe list.

Uporaba funkcije list

Nizi - list: zgledi

Uporaba funkcije 1:

Koda:

beseda = 'Ni konj'
seznam = list(beseda)

V seznamu seznam dobimo elemente:

['N', 'i', ' ', 'k', 'o', 'n', 'j']

Uporaba funkcije 2: S pomočjo funkcije sorted() uredi znake v nizu. Pred urejanjem uporabi pretvorbo niza v seznam znakov s funkcijo list().

Koda:

niz = 'Ni konj'
seznam = list(beseda)      # iz niza v seznam
seznam2 = sorted(seznam)   # znaki seznama urejeni leksikografsko in shranjeni v nov seznam


(List.JPG)
Slika 2: Koda reševanja

Nizi - metoda split

Metoda split razdeli niz na podnize, kakor jih ločuje podano ločilo. Privzeto ločilo je beli prostor (whitespaces: presledek, tabulator, ...).


>>> "Ana Berta Cilka Dani".split()
['Ana', 'Berta', 'Cilka', 'Dani']

>>> "Ana - Berta - Cilka – Dani".split()
['Ana', '-', 'Berta', '-', 'Cilka', '-', 'Dani']

Ločilo je lahko tudi drugačno:


>>> "Ana - Berta - Cilka - Dani".split(" - ")
['Ana', 'Berta', 'Cilka', 'Dani']

>>>'12/3/99'.split('/')
['12', '3', '99']

Uporaba split pri vnosu več spremenljivk:


vnos = input('Vnesi dve števili, ločeni s presledkom').split()
prvoStevilo = int(vnos[0])
drugoStevilo = int(vnos[1])

Nizi - metoda split: zgled

Naloga: Sestavi funkcijo, ki za parameter dobi niz, v katerem so z vejicami ločena cela števila. Funkcija naj vrne vsoto teh števil.


>>> vsota('5,124,52,-10,21')
192

Rešitev:

Najprej naredimo seznam, v katerem so podnizi, ki smo jih dobili z uporabo metode split nad nizom. Elementi seznama so nizi, ki jih z ustrezno funkcijo spremenimo v cela števila. Vsa števila med seboj seštejemo. Uporaba: v tekstovnih datotekah so vsa števila v tekstovni obliki in jih s spremembo iz nizov v števila obdelujemo naprej kot števila.


def vsota(niz):
   seznam = niz.split(',')
   vsota = 0            # vsoto na začetku na 0
   for st in seznam:    # gremo po vseh številih iz seznama
       vsota = vsota + int(st)

   return vsota

Nizi - metoda join

Metoda join naredi ravno nasprotno: seznam nizov združi v en sam niz. Zasukana je nekoliko nenavadno: ločilu povemo, naj združi nize iz podanega seznama. Metoda lahko uporabljamo pri sestavljanju nizov. Primer: niz spremeni v seznam, seznam obrni in ga z metodo join spremeni nazaj v niz.

Primer ukaza join z uporabo ločila:

>>> seznam = ['Jože', 'Mojca', 'Janez', 'Miha', 'Matej']
>>> niz = ','.join(seznam)
>>> niz
'Jože,Mojca,Janez,Miha,Matej'

Primer obrnjenega niza:

>>>seznam = list(niz)
>>>seznam.reverse()
>>>obrnjeniNiz = ''.join(seznam)

Ali pa

>>>obrnjeniNiz = ''.join(list(niz)[::-1])

(ListJoin.JPG)
Slika 3: Koda list in join

Nizi: vprašanje 1

Poveži ukaz z rešitvijo.

"M:o:j:c:a".split(':')
':'.join(list("Mojca")[::-1])
list('Sandi')[1:4]
['M', 'o', 'j', 'c', 'a']
'a:c:j:o:M'
['a', 'n', 'd']
'acjoM'

Preveri

Pravilno

OK.

Naprej

Napačno

Slabo.

Zapri

Nizi: vprašanje 2

Izberi napačen odgovor.

Preveri

Pravilno

OK.

Naprej

Napačno

Slabo.

Zapri

Nizi: vprašanje 3

V vrstici neke tekstovne datoteke, ki je niz, imamo zapisane dnevne temperature, merjene vsako polno uro v enem dnevu. Vrednosti so zapisane kot cela števila, ločene z vejicami. Tako imamo v vrstici zapisanih 24 podatkov. Katere funkcije in metode za delo z nizi bi uporabili za računanje povprečne temperature dneva?

Izberi pravilni odgovor.

split, int
join, split
int, list

Pravilno

Čestitam. Ti obvladaš.

Naprej

Napačno

Napačen odgovor.

Zapri

Nizi: vprašanje 4

Imaš deklariran niz

 niz = "Moja domača naloga" 

Če narediš novi niz, ki je narejen iz prejšnjega po sledeči sintaksi

 nizNov = niz[2:7] 

koliko znakov vsebuje novi niz nizNov?

Odgovor

Preveri

Pravilno

Čestitam. Ti obvladaš.

Naprej

Napačno

Napačen odgovor. Namig: dolžina niza, ki ga dobimo z rezanjem, je zgornja minus spodnja vrednost v oglatih oklepajih. Poizkusi ponovno.

Zapri

Nizi: vprašanje 5

Izberi več pravilnih odgovorov, ki določajo pravilne ukaze (funkcije oz. metode) za delo z nizi.

Preveri

Pravilno

Poiskal si vse pravilne odgovore. Odlično. Kviz je zate zaključen.

Naprej

Napačno

Odgovor ni popoln. Prosim, potrudi se še malo.

Zapri

Nizi: primer uporabe - palindrom

Naloga: Ugotovite, če je niz, ki ste ga vpisali, palindrom (niz, ki se bere iz obeh strani enako). Predpostavimo, da smiselni niz kot na primer pericarežeracirep ne vsebuje presledkov. Pomoč: uporabite seznam, ki ste ga naredili iz niza s pomočjo funkcije list ali split, in drugi seznam, ki je obrnjeni seznam prvega. Na koncu sledi primerjava obeh seznamov s pomočjo zanke for ali primerjavo obeh nizov.



Postopek reševanja 1

  1. Vpišite niz.
  2. Niz pretvorite v prvi seznam s pomočjo funkcije list.
  3. Drugi seznam ustvarite s pomočjo list iz niza in ga obrnite z metodo reverse().
  4. Spremenljivko palindrom postavi na resnično (True) - na začetku predvidimo, da je palindrom
  5. Uporaba zanke: ponavljaj, dokler ne prideš do konca obeh seznamov hkrati

    • Primerjaj znak po znak prvega seznama z znakom drugega seznama - ali sta znaka različna:

      • da: spremenljivko palindrom postavi na neresnično (False)
      • končaj z delom v zanki oz. izhod iz zanke
  6. v odvisnosti od vrednosti spremenljivke palindrom izpiši, ali je niz palindrom (spremenljivka palindrom je resnična):

    • da: niz je palindrom
    • ne: niz ni palindrom



Postopek reševanja 2

  1. Vpišite niz.
  2. Ustvarite seznam s pomočjo list iz niza in ga obrnite z rezanjem.
  3. Seznam spremenite v niz (metoda join)
  4. Primerjajte oba niza med seboj - ali sta niza enaka:

    • da: niz je palindrom
    • ne: niz ni palindrom
0%
0%