Sortimine

Sortimine ehk elementide järjestamine mingi kindla reegli alusel. Pythonis on vajalik sortimisfunktsioon olemas. Lihtsal juhul saab seda kasutada järgmiselt:

list_of_numbers = [5, 2, 3, 1, 4]
another_list = sorted(list_of_numbers)
print(list_of_numbers)
print(another_list)

Annab tulemuseks:

[5, 2, 3, 1, 4]
[1, 2, 3, 4, 5]

sorted funktsioon tagastab uue järjendi, milleks on sisse antud järjendi sorditud variant. Algne (sisend) järjend ei muutu.

Teine võimalus on kasutada järjendi meetodit sort:

list_of_numbers = [5, 2, 3, 1, 4]
another_list = list_of_numbers.sort()
print(list_of_numbers)
print(another_list)

Väljund:

[1, 2, 3, 4, 5]
None

Nagu näha, list_of_numbers (algne järjend) on muutunud (on sorditud). sort meetod ise tagastab None, seepärast on see ka another_list sisu.

Tagurpidi sortimine

Eelnevalt sorditi arvud kasvavalt (eespool oli väiksem, tagapool suurem). Selleks, et tulemus saada teistpidi (eespool suurem, tagapool väiksem), saab kasutada parameetrit reverse.

list_of_numbers = [5, 2, 3, 1, 4]
print(sorted(list_of_numbers, reverse=True))

Tulemus:

[5, 4, 3, 2, 1]

Analoogselt:

list_of_numbers = [5, 2, 3, 1, 4]
list_of_numbers.sort(reverse=True)
print(list_of_numbers)
[5, 4, 3, 2, 1]

key funktsioon

Eelmiste näidete korral koosnes järjend arvudest ja nende sortimisel kasutatakse elementide väärtusi. Ehk siis 1 on eespool kui 2 jne.

Sortimine lühidalt toimub nii, et võetakse kaks elementi järjendist, võrreldakse neid ning vastavalt tulemusele tõstetakse väiksem ettepoole, suurem tahapoole.

Igakord ei piisa sellest, et võrrelda väärtusi otse. Sortimisel on võimalik kaasa anda funktsioon, mida rakendatakse elementidele enne nende võrdlemist. Ehk siis enne kahe elemendi võrdlemist (näiteks sõned "aa", "b", mis muidu võrdlemisel "aa" < "b") rakendatakse funktsiooni ja võrreldakse selle tulemusi (näiteks len("aa") > len("b")). Etteantud funktsioon peab olema selline, mis võtab sisse ühe elemendi ja tagastab väärtuse. Kasutada võib nimeliselt olemasolevat funktsioon, aga võib kasutada ka lambda-funktsiooni.

names = ["ago", "mati", "reinuvader", "kasparr", "guido"]
print(sorted(names, key=lambda x: x.count('a') + x.count('r')))

Tulemus:

['guido', 'ago', 'mati', 'reinuvader', 'kasparr']

See (absurdne) näide teeb nii, et sordib sõnad selle järgi, palju neis esineb 'a' ja 'r' tähti. Eespool on sõnad, kus neid esineb vähem.

Lisaks võib kaasa anda ka reverse=True.

Olemasoleva funktsiooni kasutamine

key parameetrina võib kaasa anda ka eelnevalt defineeritud funktsiooni. Näiteks:

def second_letter(word):
    return word[1]  # here we should check that the string is long enough

names = ["aye", "xai", "mxo"]
print(sorted(names, key=second_letter))

Pange tähele, et kaasa antakse funktsiooni nimi ilma sulgudeta. Funktsioonile antakse argumendina kaasa element, funktsioon peab tagastama väärtuse, mida võrdlema hakatakse (antud näite puhul võetakse etteantud sõnest teine sümbol).

Miinimum ja maksimum

Pythonis saab kasutada funktsioone min ja max. Need leiavad vastavalt minimaalse ja maksimaalse elemendi. Kasutamine käib sarnaselt sorted funktsioonile. Esimene argument on järjend, millest hakatakse minimaalset või maksimaalset väärtust leidma. Lisaks võib kaasa anda key funktsiooni, mida kasutatakse elementide võrdlemiseks. Funktsioon tagastab ühe elemendi - vastavalt siis kas minimaalse või maksimaaalse.

print(min(names, key=lambda x: x[::-1]))

min ja max on kasutatavad ka ilma järjendita - sellisel juhul tuleb anda kaasa mitu argumenti ning nende hulgast leitakse vastav ekstreemum.

print(min("b", "a", "c"))   # -> a

Viiteid

Anonüümne funktsioon: Anonüümne funktsioon (lambda)

https://wiki.python.org/moin/HowTo/Sorting

https://www.youtube.com/watch?v=lyZQPjUT5B4 - tantsuline sortimine (mullsort)