Sortiranje u Pythonu

(Ostvarivanje ishoda u domeni Računalno razmišljanje i programiranje - 8. raz. OŠ)

Ivana Vezjak

OŠ August Šenoa, Osijek

Obrazovni ishodi u domeni Računalno razmišljanje i programiranje (8.raz.)

  • B.8.1  učenik identificira neki problem, stvara program za njegovo rješavanje, dokumentira rad programa i predstavlja djelovanje programa drugima.                                                           
  • B.8.2 učenik prepoznaje i opisuje algoritam sortiranja, primjenjuje jedan algoritam sortiranja za rješavanje zadanog problema u programskom jeziku.                                                    
  • B.8.3 učenik prepoznaje i opisuje mogućnost primjene rekurzivnih postupaka pri rješavanju odabranih problema te istražuje daljnje mogućnosti primjene rekurzije.                             
  •  B.8.4 učenik prepoznaje i proučava interdisciplinarnu primjenu računalnoga razmišljanja analiziranjem i rješavanjem odabranih problema iz različitih područja učenja.       

Algoritmi sortiranja

Bubble sort (Mjehuričasto sortiranje)

brojevi = [5, 8, 9, 2, 1, 4]

for i in range(len(brojevi)-1):
    for j in range((len(brojevi)-1)-i): # provjeravamo svaki element niza
        
        if brojevi[j] > brojevi[j+1]:
            brojevi[j], brojevi[j+1] = brojevi[j+1], brojevi[j] # napravi zamjenu

print(brojevi)

Selection sort (Sortiranje izborom)

brojevi = [5, 8, 4, 12, 9, 1]

for i in range(len(brojevi)-1,0,-1):
    naj = 0
    for j in range(1, i+1):
        # usporedi trenutnu najvecu vrijednost i sljedeci element niza
        if brojevi[j] > brojevi[naj]: 
            naj = j

    #zamjena
    brojevi[i], brojevi[naj] = brojevi[naj], brojevi[i]

print(brojevi)

Preporuka za ostvarenje OO ishoda

(kurikulum nastavnog predmeta INF)

  • Preporuča se uporaba gotove funkcije soritranja u zadanom programskom jeziku ili primijeniti gotov (pokazni primjer) algoritam sortiranja. 
  • Koristiti se različitim zadacima u kojima se traži slaganje/organiziranje objekata prema nekom kriteriju, npr. od najmanjeg do najvećeg i obrnuto...

Sortiranje u Pythonu

metoda sort funkcija sorted()
mijenja postojeću listu, vraća vrijednost None vraća novu sortiranu listu,
originalnu ne dira
brža pošto ne stvara kopiju sporija
sortira samo listu sortira i druge tipove podataka

Metoda sort()

 

  • sintaksa: naziv.sort(ključ, obrnuti redosljed)
brojevi = [4, 5, 6, 2, 1]
brojevi.sort()
print(brojevi) # Izlaz: [1, 2, 4, 5, 6]

brojevi2 = [5, 6, 7, 8, 1, 2]
brojevi2.sort(reverse = True)
print(brojevi2) # Izlaz: [8, 7, 6, 5, 2, 1]

imena = ["Josip Peric", "Tina Anic", "Marko Buric", "Ivan Horvat"]
imena.sort()
print(imena) # Izlaz: ['Ivan Horvat', 'Josip Peric', 'Marko Buric', 'Tina Anic']

imena2 = ["Josip Peric", "Tina Anic", "Marko Buric", "Ivan Horvat"]
imena2.sort(key=lambda s: s.split()[1])
print(imena2)# Izlaz: ['Tina Anic', 'Marko Buric', 'Ivan Horvat', 'Josip Peric']


Funkcija sorted()

 

  • sintaksa: sorted(naziv, ključ, obrnuti redosljed)
brojevi = [5, 6, 2, 1, 8, 6]
a = sorted(brojevi)
print(a) # Izlaz: [1, 2, 5, 6, 6, 8]
a = sorted(brojevi, reverse = True)
print(a) # Izlaz: [8, 6, 6, 5, 2, 1]

voce = ['mango', 'kivi', 'lubenica', 'banana', 'jagoda']
print(sorted(voce)) # Izlaz: ['ananas', 'banana', 'jabuka', 'jagoda', 'kruska']
print(sorted(voce, key = len)) # Izlaz: ['jabuka', 'kruska', 'ananas', 'banana', 'jagoda']

x = "python"
print(sorted(x)) # Izlaz: ['h', 'n', 'o', 'p', 't', 'y']

Funkcija lambda

  • funkcija bez imena, tzv. anonimna funkcija, kratka i u jednom retku
#funkcija zbroj

def zbroj(a,b):

    return a + b


#lambda funkcija

zbroj = lambda a,b : a + b

ZADACI ZA VJEŽBU:

Pomozi Djedu Mrazu da spasi Božić! *

* tema Božića se može mijenjati po potrebi

Djed Mraz je imao napornu godinu.

Tijekom cijele godine gledao je djecu

po svijetu te bilježio u svoju bilježnicu

tko je bio dobar, a tko ne.

 

 

Ispred svakog djeteta koje je zaslužilo dar stavio je +, a onima

manje dobrima stavio je znak -.

 

S obzirom da sada u svojoj bilježnici ima puno imena sa znakovima + i -, potrebna mu je tvoja pomoć da ih sortira. 

1. zadatak

Napiši program koji prima n imena, a ispred svakog imena je znak + ili -.

Ovisno o znaku + ili - spremi ime u listu jako-dobri ili u listu manje-dobri

Rješenje:

jako_dobri = []
manje_dobri = []
n = int(input("Broj imena"))
for i in range(n):
    ime = input("Upiši znak i ime:")
    ime2 = ime.split(" ")
    if ime2[0] == "+":
        jako_dobri.append(ime2[1])
    else:
        manje_dobri.append(ime2[1])
        
print(jako_dobri)
print(manje_dobri)

Rudolf se našao u nezgodnoj situaciji. Jutros mu je Djed Mraz dao veeeeliki popis djece i zamolio ga da označi samo one koji su bili dobri i koji će dobiti poklone ove godine.

 

Djed Mraz je tijekom godine redovito zapisivao tko je bio dobar, tako da te podatke ima zapisane u svojoj bilježnici.

 

Rudolf mora usporediti imena djece s popisa s onima u Djedovoj bilježnici i zaokružiti one koji se nalaze na obje liste te napraviti novi popis i sortirati ih abecedno.

2. zadatak

•Napiši funkciju koja prima dvije liste (Djedovu i Rudolfovu) te vraća abecedno sortiranu listu samo onih imena koja se pojavljuju i kod Djeda i kod Rudolfa

Rješenje:

def usporedi(djed, rudolf): 
    konacni = [] 
    for c in rudolf: 
        if c in djed:
            konacni.append(c) 
    return sorted(konacni)

Djed konačno ima popis djece kod koje mora stići no postoji još jedan problem.

 

Rudolf je odlučio učiti geografiju. I ne želi nikuda ići dok ne nauči nabrojati planete sunčevog sustava od najmanjeg do najvećeg. U Djedovoj bilježnici našao je neki čudan popis i sada pokušava otkriti koji je planet najmanji, koji najveći itd...

 

Tvoj zadatak je pomoći Rudolfu da što prije sortira planete od najmanjeg do najvećeg i krene s Djedom Mrazom na put!

3. zadatak

Napiši program koji će iz priložene liste ispisati nazive planeta od najmanjeg do najvećeg

planeti = [
    #naziv, polumjer, udaljenost Zemlja-Sunce
    ["Merkur",2440, 0.395],
    ["Venera", 6052, 0.723],
    ["Zemlja", 6370, 1.000],
    ["Mars", 3396, 1.530],
    ["Jupiter",71492, 5.210],
    ["Saturn",60268, 9.551],
    ["Uran",25559, 19.213],
    ["Neptun",26764,30.070] 
]

Rješenje:

planeti = [
    ["Merkur",2440, 0.395],
    ["Venera", 6052, 0.723],
    ["Zemlja", 6370, 1.000],
    ["Mars", 3396, 1.530],
    ["Jupiter",71492, 5.210],
    ["Saturn",60268, 9.551],
    ["Uran",25559, 19.213],
    ["Neptun",26764,30.070] 
]
def velicina(element):
    return element[1]
planeti.sort(key = velicina)
for i in planeti:
    print(i[0])

Djed Mraz ima popis djece do koje mora doći, Rudolf je sretan pošto je naučio planete po veličini, sada još samo ostaje okupiti sve sobove i posložiti ih u red po dvoje ispred saonica.

 

Djed ih svake godine posloži abecednim redom (po prezimenu) no ove godine je imao toliko problema da je zaspao u saonicama. Pomozi Rudolfu da sortira sobove po prezimenu i posloži ih ispred saonica!

4. zadatak

Napiši funkciju koja će zadanu listu sortirati po prezimenu:

sobovi = ["Dasher Disney", "Dancer Moore", "Prancer Jones", 
          "Vixen Hall", "Comet Smith", "Cupid Knight", "Donder Taylor", 
          "Blitzen Claus" ]

Rješenje:

sobovi = ["Dasher Disney", "Dancer Moore", "Prancer Jones", 
          "Vixen Hall", "Comet Smith", "Cupid Knight", 
          "Donder Taylor", "Blitzen Claus" ]

print (sorted(sobovi))
sobovi.sort(key=lambda s: s.split()[1])

print (sobovi)

Sobovi su spremni, Djed Mraz se probudio i svi su uzbuđeni što uskoro kreću na put!

 

Djed je već dao Rudolfu znak za polazak no onda se pojavio novi problem. Dotrčao je mali patuljak Bingle i dao Djedu neobičnu poruku.....

Poruka je glasila....

OKEILEKOUNDSOOJASLBOEM OJVEDIOLC5ABAOŠOPNIJ!HIJRINOUKEO!

5. zadatak

Pomozi Djedu da dešifrira ovu važnu poruku i krene na put! Božična čarolija sve nas čeka!

 

Pomoć:

Podijeli s brojem 5 duljinu poruke

 

Rješenje:

a = "OKEILEKOUNDSOOJASLBOEMOJVEDIOLC5ABAOŠOPNIJ!HIJRINOUKEO!"
poruka = ""
n = len(a)//5
for k in range(n):

    for i in range(k,len(a),n):
        poruka += a[i]
        
print(poruka) #Izlaz: OSOBIKOJAJEOVORIJEŠILADONESIPOKLONUOBLIKUOCJENE5!ODMAH!
Made with Slides.com