Liste

Recimo da želimo da uzmemo trideset rezultata kolkvijuma i da nešto sa njima uradimo, recimo da ih sortiramo po broju poena. Mogli bi da kreiramo trideset varijabli score1, score2, …, score30, ali bi to bilo vrlo zamorno i dosadno. Još bi bilo teže urediti te varijable po veličini. Rešenje za ovo su liste.

Osnovni koncepti

Kreiranje liste

Evo jednog prostog primera:

L = [1,2,3]

Koristimo uglaste zagrade da označimo početak i kraj liste, a podatke u listi odvajamo zarezima.

Prazna lista

Prazna liste je []. To je analogno sa 0 kod brojeva ili sa ‘’ kod stringova;.

Dugačke liste

Ako imate neku dugačku listu, takvu listu može da napišete u više linija, kao što je prikazano:

nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
        17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
        32, 33, 34, 35, 36, 37, 38, 39, 40]

Ulaz (input)

Možemo koristiti funkciju eval(input()) kada od korisnika tražimo da unese listu. Evo primera:

L = eval(input('Unesite listu: '))
print('Prvi element liste je ', L[0])


Unesite listu: [5,7,9]
Prvi element liste je 5

Štampanje liste (print)

Možete koristiti print funkciju za štampanje cele liste:

L = [1,2,3]
print(L)

[1, 2, 3]

Tipovi podataka u listi

Lista može da sadrži bilo šta, pa čak i nove liste. Na primer ovo je potpuno ispravna lista:

[1, 2.718, 'abc', [5,6,7]]

Sličnost sa stringovima

Postoji niz stvari koje funkcionišu na isti način u listama kao u stringovima.

len — Funkcija koja daje dužinu liste L je len(L). in — Operator in određuje da li lista sadrži traženi podatak. Evo primera:

if 2 in L:
    print('Vaša lista sadrži broj 2.')
if 0 not in L:
    print('Vaša lista ne sadrži nulu.')

Indeksiranje i segmentacija (slicing) — I ovo funkcioniše kao kod stringova. Na primer L[0] je prvi podatak liste L, a L[:3] daje prva tri podatka.

index i count — Ove metode rade na isti način kao kod stringova: L.index(x) vraća prvu poziciju podatka x u listi L (vraća -1 ako x nije u L), a L.count(x) vraća broj pojavljivanja x u L.

`+` and `*` — Operator + dodaje jednu listu na kraj druge liste. Operator * ponavlja listu određeni broj puta. Evo primera:

Izraz Rezultat
[7,8] + [3,4,5] [7,8,3,4,5]
[7,8]*3 [7,8,7,8,7,8]
[0]*5 [0,0,0,0,0]

Poslednji primer je posebno koristan kada treba brzo napraviti listu nula.

Petlje — Iste dve vrste petlji rade kako kod stringova tako i kod lista. U oba ova slučaja štampaju se podaci iz liste, jedan po jedan, svaki u posebnoj liniji.

for i in range(len(L)):                 for podatak in L:
    print(L[i])                             print(podatak)

Leva petlja je korisna kada želimo u petlji da koristimo i varijablu petlje. Ako to nije potrebno dovoljna je desno prikazana petlja, koja je nešto jednostavnija.

Ugrađene funkcije (built-in functions)

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

Funkcija Opis
len Vraća dužinu liste (broj podataka u listi)
sum Vraća sumu podataka u listi
min Vraća najmanji podatak u listi
max Vraća najveći podatak u listi

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

average = sum(L)/len(L)

Metode sa listama

Evo nekih metoda sa listama:

Metod Opis
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
pop(p) Uklanja podatak sa indeksom p i vraća njegovu vrednost
insert(p,x) Ubacuje podatak x na poziciju p u listi

Važna napomena

Postoji velika razlika između list i strig metoda: String methode ne menjaju originalni string, dok list metode menjaju originalnu lsitu. Da sortiramo listu L, jkoristimo L.sort() a ne L=L.sort(). U stvari ova poslednja naredba neće uopšte raditi.

pogrešno ispravno
s.replace(‘X’, ‘x’) s = s.replace(‘X’, ‘x’)
L = L.sort() L.sort()

Ostale list methode

Postoji još nekoliko list metoda. Ukucajte help(list) u Python shell-u da vidite dokumentaciju o njima.

Primeri operacija sa listama

Pravljenje kopije liste

Pravljenje kopije liste je po malo čudno zbog načina na koji to Python radi. Recimo da imamo listu L i da želimo da od nje napravimo kopiju koju ćemo zvati M. Izraz M=L neće raditi zbor razloga koji će biti kasnije objašnjeni. Za sada, umesto M=L koristite sledeću naredbu:

M = L[:]

Promena u listi

Promena podataka u listi je mnogo jednostavnija nego kod stringova. Da promenimo podatak na poziciji 2 u listi L tako da bude 100, prosto napišemo L[2]=100. Ako želimo da ubacimo podatak čija je vrednost 100 na poziciju 2, a da pri tome ne uništimo podatak koji se tamo već nalazi, u tu svrhu koristimo metod insert. Da obrišemo podatak iz liste koristimo del operator. Neki primeri su prikazani dole. Pretpostavimo da je L=[6,7,8] ya svaku od prikazanih operacija.

Operacija Nova lista Opis
L[1] = 9 [6, 9, 8] Zamenjuje podatak sa indeksom 1 tako da bude 9
L.insert(1, 9) [6, 9, 7, 8] Ubacuje podatak 9 na poziciju (indeks) 1 bez zamene
del L[1] [6, 8] Briše drugi podatak
del L[:2] [8] Briše prva dva podatka

Primeri rada sa listama

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

Koristili smo metod append za dodavanje podataka u praznu listu, []. Alternativa append metodu je sledeća naredba:

L = L + [randint(1,100)]

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

Data je lista L koja sadrži brojeve između 1 i 100. Kreirajte novu listu čiji je prvi element broj jedinica u listi L, drugi podataka, broj dvojaka u listi L, i tako dalje.

frekvencije = []
for i in range(1,101):
    frekvencije.append(L.count(i))

Ključna stvar je metoda count koja nam kazuje koliko se puta neki podatak pojavljuje u listi.

Primer 5

Napišite program koji štampa dva najveća i dva najmanja broja iz liste koja se zove scores.

scores.sort()
print('Dva najmanja: ', scores[0], scores[1])
print('Dva najveća: ', scores[-1], scores[-2])

Jednom kada je lista sortiranja najmanje vrednosti se nalaze na početku a najveće na kraju liste.

Primer 6

Ovaj program služi za igranje jednostavnog kviza.

broj_tacnih = 0
# Pitanje 1
print('Koji je glavni grad Francuske?', end=' ')
odgovor = input()
if odgovor.lower()=='pariz':
    print('Tačno!')
    broj_tacnih+=1
else:
    print('Pogrešno.  Tačan odgovor je Pariz.')
print('Imate', broj_tacnih, 'od 1 tačnih odgovora.')

#Pitanje 2
print('Sa koliko država se graniči Mađarska?', end=' ')
odgovor = input()
if odgovor=='7':
    print('Tačno!')
    broj_tacnih+=1
else:
    print('Pogrešno.  Tačan odgovor je 7.')
print('Imate', broj_tacnih, 'od 2 tačnih odgovora.')

Gornji program radi ali je vrlo dosadan. Ako želimo da dodamo još pitanja, moramo da kopiramo čitave blokove nardbi i da u njima menjamo mnoge stvari. Ako odlučimo da izmenimo strukturu kviza, kao na primer da ne kazujemo tačne odgovore, tada se svaki blok koda mora menjati. Dosadni programi kao ovaj se mogu značajno pojednostaviti korišćenjem lista i petlji, kao što je dole prikazano:

pitanja = ['Koji je glavni grad Francuske?',
             'Sa koliko država se graniči Mađarska?']
odgovori = ['Pariz','7']

broj_tacnih = 0
for i in range(len(pitanja)):
    odgovor = input(pitanja[i])
    if odgovor.lower()==odgovori[i].lower():
        print('Tačno')
        broj_tacnih=broj_tacnih+1
    else:
        print('Pogrešno.  Tačan odgovor je', odgovori[i])
    print('Imate', broj_tacnih, 'od', i, 'tačnih odgovora.')

Ako pažljivo pogledate ovaj program, videćete da je petlja skoro ista kao one u prethodnom programu, osim što koristi pitanja[i] i odgovori[i] umesto teksta pitanja.

Ovo nam pokazuje jednu generalnu tehniku: Ako vidite da ponavljate isti kod više puta, probajte da koristite liste i petlje.

Korist od svega toga (osim što je program kraći ) je i u tome kada menjamo ili dodajemo pitanja, treba samo promeniti liste pitanja i odgovori .Takođe, ako želite da menjate strukturu programa, kao na primer da ne kazujete tačne odgovore, sve što treba da uradite je da modifikujete jednu jedinu liniju koda, umesto mnogo kopija te iste linije u starom programu.

Vežbe

7.1 Napišite program koji traži od korisnika da unese listu celih brojeva. Program treba da uradi sledeće:

  • Štampa ukupan broj podataka u listi.
  • Štampa poslednji podatak u listi.
  • Štampa listu obrnutim redosledom.
  • Štampa Da ako lista sadrži 5 na Ne ako ne sadrži.
  • Štampa broj petica u listi.
  • Briše prvi i poslednji podatak iz liste, sortira preostale podatke i štampa rezultat.
  • Štampa koliko celih brojeva u listi je manje od 5.

7.2 Napišite program koji generiše listu od 20 slučajnih brojeva između 1 i 100, pa:

  • Štampa listu.
  • Štampa srednju vrednost svih elemenata iz liste.
  • Štampa najveću i najmanju vrednost iz liste.
  • Štampa drugu najmanju i drugu najveću vrednost iz liste.
  • Štampa koliko ima parnih brojeva u listi.

7.3 Počnite sa listom [8,9,10]. Uradite sledeće:

  • Postavite drugi element (indeks 1) na 17
  • Dodajte 4, 5, i 6 na kraj liste
  • Brišite prvi element liste
  • Sortirajte listu
  • Duplirajte listu
  • Ubacite 25 na indeksu 3

Na kraju treba da dobijete listu [4,5,6,25,10,17,4,5,6,10,17] 7.4 Tražite od korsinika da unese listu koja sadrži brojeve između 1 i 12. Zatim zamenite sve brojeve koji su veći od 10 sa brojem 10.

7.5 Tražite od korisnika da unese listu stringova. Kreirajte novu listu koja sadrži iste stringove ali bez prvog slova.

7.6 Kreirajte sledeće liste korišćenjem petlji.

  • Listu koj se sastoji od brojeva 0 do 49
  • Listu koja sadrži kvdrate brojeva od 1 do 50.
  • Listu [‘a’, ‘bb’, ‘ccc’, ‘dddd’, … ] koja se završava sa 26 kopija slova z.

7.7 Napišite program koji uzima dve liste L i M, iste dužine, dodaje njihove elemente da kreira novu listu N čiji su elementi sume odgovarajućih elemenata iz L i M. Na primer, ako je L=[3,1,4] i M=[1,5,9], odna će N biti [4,6,13].

7.8 Napišite program koji traži od korisnika da unese ceo broj, pa kreira listu koja se sastoji od faktora tog broja.

7.9 Kada igrate igru u kojoj se koriste dve kockice, valja znati kolike su šanse za pojavljivanje nekog ishoda. Na primer verovatnoća za dobijanje 12 je oko 3%, a verovatnoća za dobijanje 7 je oko 17%. Mogli bi izračunati ovo matematički, ali ne znate verovatnoću. Međutim, znate na napišete program kojim ćete simulirati bacanje dve kockice 10000 puta i izračunati koliki je procenat pojavljivanja ishoda 2, 3, 4, …, 12.

7.10 Napišite program koji rotira elemente liste tako da se element na prvom indeksu pomera na drugi, drugi na treći, itd., sve do poslednjeg koji se pomera na prvi indeks.

7.11 Korišćenjem for petlje kreirajte listu prikazanu dole, koja se sastoji od jedinica razdvojenih rastućim brojem nula. Poslednje dve jedinice treba da budu razdvojene sa deset nula.

[1,1,0,1,0,0,1,0,0,0,1,0,0,0,0,1,....]

7.12 Napišite program koji generiše 100 slučajnih brojeva koji su ili 0 ili 1. Zatim odredite najduži uzastopni niz nula. Na primer, najduži uzastopni niz nula u listi [1,0,1,1,0,0,0,0,1,0,0] je 4.

7.13 Napišite program koji briše višestruka pojavljivanja podataka u listi, tako da se podaci pojavljuju samo jednom. Na primer lista [1,1,2,3,4,3,0,0] će posle takvog brisanja postati [1,2,3,4,0].

7.14 Napišite program koji traži od korsinika da unese dužinu u fitima. Program treba da korisniku pruži mogućnost da bira jednicu u koju će ta dužina biti konvertovana. Jedinice mogu biti inči, jarde, milje, milimetri, samtimetri,metri ili kilometri. Iako ovo može biti urađeno if naredbama, mnogo je kraće ako koristimo liste i for petlje, a takođe je mnogo lakše ako želimo da dodamo nove jedinice za konverziju.

7.15 Postoji neprobojna šifra pod nazivom „jednokratni ključ“.Način na koji ona radi je da pomerate svako slovo poruke za slučajan broj između 1 i 26, sa preklapanjem azbuke ako je potrebno. Na primer ako je slovo koje treba šifrirati y a slučajni pomak 5, tada je novo slovo d. Svako slovo dobija svoj pomak, pa nam je potrebno onoliko slučajnih pomaka koliko ima slova u poruci. Kao primer recimo da je korisnik uneo reč secret . Program treba da generiše 6 slučajnih brojeva između 1 i 26. Pretpostavimo da su generisani brojevi 1, 3, 2, 10, 8, i 2. Šifrovana poruka će biti thebmv.

  • Napišite program koji traži od korisnika da unese poruku, pa tu poruku šifrira korišćenjem gornjeg metoda. Najpre konverujte string u mala slova. Svaki blanko znak i znak interpunkcije treba da ostane nepromenjen. Na primer Secret!!! postaje thebmv!!! korišćenjem gornjih pomaka.
  • Napišite program koji dešifruje poruke šifrovane na gornji načina.

Razlog zašto se ovaj metod zove „jednokratni ključ“ je zato što se slučajni pomaci koriste samo jedanput. Šifra bi mogla biti lako razbijena ako bi se isti pomaci koristili u više poruka. Čak štaviše, ovaj metod je potpuno siguran samo ako su slučajni brojevi stvarno slučajni što nije slučaj sa randint funkcijom koja daje takozvane pseudo slučajne brojeve. Za potrebe kriptografije postoje drugi pouzdaniji načini generisanja slučajnih brojeva.