среда, 6. мај 2020.

SLOŽENE STRUKTURE PODATAKA (2)


RAD SA LISTAMA

U prošloj lekciji smo u primerima imali liste definisane u samom programu. Međutim, u praksi se elementi liste unose standardnim ulazom sa tastature ili čitanjem iz fajla. Na početku se, kao i za promenljivu, inicijalizuje početna vrednost, najčešće prazna lista.

L = [ ]
Između uglastih zagrada nema razmaka.

Često se  koristi petlja za prolazak kroz svaku vrednost u listi. Ako je L lista, komanda

for x in L: «telo petlje»


radi sledeće: prvo x dobija vrednost prvog elementa iz liste L, i izvršava se telo: onda u sledećem krugu x predstavlja drugu vrednost u L, i izvršava se telo; takav postupak se nastavlja za sve članove L

Dodavanje i brisanje elemenata

U mnogim programskim jezicima, veličina niza je fiksna, te se navodi prilikom njegovog kreiranja, pa ako se preračunate, završićete sa mnogo neiskorišćenog prostora ili sa elementima koje ne možete smestiti u niz. Ako koristite indeks veći od postojećeg, program javlja grešku prekoračenja.

Liste u Pythonu nisu fiksne veličine, već rastu i smanjuju se po potrebi, prilikom dodavanja, odnosno brisanja elemenata. Za dodavanje elemenata, koristićemo funkcije append, za dodavanje na kraj, odnosno insert, za umetanje elementa na određenu poziciju u nizu. Da bi se napravilo mesta za element koji se ubacuje u niz, svi elementi koji su desno od novog elementa se "pomere" za jedno mesto u desno. Za brisanje bilo kog od elemenata, tu je naredba del.

pocetnaLista = [14, 8, 7, 12, 11]

# Dodamo element na kraj
pocetnaLista.append(999)
print('Nakon dodavanja na kraj:', pocetnaLista)
Nakon dodavanja na kraj: [14, 8, 7, 12, 11, 999]


# Umetnemo element na poziciju 2
pocetnaLista.insert(2, 100)
print('Nakon umetanja na poziciju 2:', pocetnaLista)
Nakon umetanja na poziciju 2: [14, 8, 100, 7, 12, 11, 999]



# Obrišimo ono što smo dodali:
del pocetnaLista[-1] # Element na kraju
del pocetnaLista[2]  # Element na poziciji 2


 Ovde ne možemo preterati sa indeksima: Ako je indeks prevelik, element se dodaje na kraj. Ako je indeks previše mali, element se dodaje na početak, npr:

pocetnaLista.insert(200, 'ja sam na kraju')
pocetnaLista.insert(-50, 'ja sam na pocetku')

Nakon umetanja:   ['ja sam na pocetku', 14, 8, 7, 12, 11, 'ja sam na kraju']

Segmentacija liste

Zvanični termin za ovu operaciju je slice. Operacija je jednostavna - iz liste iseći određeni deo. Kad će mi to trebati? Pa recimo:

Zanima vas ekstenzija fajla - odsečete poslednja tri karaktera.
Zanima vas godina nečijeg rođenja, a imate njegov matični broj - odsečete sve od petog do osmog karaktera
Zanima vas 5 najboljih i 5 najgorih rezultata na Olimpijadi
I još mnogo toga
Slično indeksiranju, koristi se operator [ ], ali ovaj put ne navodimo jedan broj, već dva, koje predstavljaju granice onog što želimo da isečemo, a odvojene sa dvotačkom ( : ). Važno je za napomenuti, sečenje uzima sve elemente počevši od prvog, do ali ne uključujući poslednjeg. Za razliku od indeksiranja, rezultat sečenja je uvek lista, koja u zavisnosti od granica sečenja može biti prazna, imati jedan ili više elemenata.

pocetnaLista = [14, 8, 7, 12, 11]

print('Prva tri elementa', pocetnaLista[0:3])
Prva tri elementa [14, 8, 7]


print('Svi elementi osim poslednjeg', pocetnaLista[0:-1])
Svi elementi osim poslednjeg [14, 8, 7, 12]

# Iako je rezultat samo jedan element, sečenje vraća niz!
print('Samo prvi element', pocetnaLista[0:1])
Samo prvi element [14]


# Ili nekad prazan
print('Nepostojeći isečak', pocetnaLista[100:120])
Nepostojeći isečak []

S obzirom da često želimo prvih nekoliko ili poslednjih nekoliko elemenata, postoji nekoliko skraćenica:

Ako se izostavi prva granica, podrazumeva se da je nula
Ako se izostavi poslednja granica, podrazumeva se da je jednaka dužini niza (ovo se radi da bi bio obuhvaćen i poslednji element)
Ako se izostave obe granice, vraća se kopija liste

pocetnaLista = [14, 8, 7, 12, 11]

print('Prva dva elementa', pocetnaLista[:2])
Prva dva elementa [14, 8]

print('Poslednja dva elementa', pocetnaLista[-2:])
Poslednja dva elementa [12, 11]


Postoji više ugrađenih funkcija koje rade sa listama. Ovde prikazujemo neke od najkorisnijih:

len     Računa dužinu liste (broj podataka u listi)
sum   Računa sumu podataka u listi
min   Nalazi najmanji podatak u listi
max  Nalazi najveći podatak u listi

Na primer, sledeća naredba izračunava srednju vrednost  brojeva iz liste L:

average = sum(L)/len(L)

append(x)   Dodaje podatak x na kraj liste
sort()           Sortira listu
count(x)      Vraća broj pojavljivanja podatka x u listi
index(x)      Vraća poziciju prvog pojavljivanja podatka x u listi
reverse()     Invertuje listu (obrće redosled podataka u listi)
remove(x)   Ukljanja (briše) prvo pojavljivanje podatka x u listi
insert(p,x)   Ubacuje podatak x na poziciju p u listi


Primer 1:

Napišite program koji generiše listu L od 50 slučajnih brojeva između 1 i 100.

from random import randint
L = [ ]
for i in range(50):
    L.append(randint(1,100))

Iz Excela se sećamo funkcije randint koja generiše slučajne brojeve. Ovde takođe postoji, samo je pozivamo iz biblioteke random.
Koristili smo funkciju append za dodavanje podataka u praznu listu, [].

Primer 2:

Zamenite svaki podatak iz liste L sa njegovim kvadratom.

for i in range(len(L)):
    L[i] = L[i]**2

Primer 3:

Prebrojte koliko podataka iz liste L je veće od 50.

brojac = 0
for pod in L:
    if pod>50:
        brojac = brojac+1

Primer 4:

Iz datog niza brojeva izdvojiti parne i upisati u drugu listu

    rez = [ ]
    for x in L:
        if x %2== 0:
            rez.append(x)
   
Primer 5:

Napiši program koji učitava broj ocena učenika, a zatim i pojedinačne ocene (svaku u posebnom redu) i na kraju određuje i ispisuje prosečnu ocenu tog učenika.

Elemente u listu možemo učitati tako što na početku krenemo od prazne liste (liste [ ]), a zatim u petlji učitavamo jedan po jedan element i dodajemo ga u listu funkcijom append.


broj_ocena = int(input("Unesi broj ocena:"))
ocene = [ ]
for i in range(broj_ocena):
    ocena = int(input("Unesi ocenu:"))
    ocene.append(ocena)
prosek = sum(ocene) / len(ocene)
print("Prosek:", prosek)

Zadaci za vežbu:

Ako je lista zadata naredbom a=[9,5,2,7,4,6], šta će biti rezultati izraza:
1. len(a)
2. min(a)
3. del(a[4])
4. del(a[:4])
5. a.append(3)
6. Može li lista podataka biti prazna? Ako može, kako se kreira?


Нема коментара:

Постави коментар