{"id":306,"date":"2011-04-14T15:35:50","date_gmt":"2011-04-14T12:35:50","guid":{"rendered":"http:\/\/python.pingviinitiivul.ee\/?p=306"},"modified":"2011-04-14T20:40:04","modified_gmt":"2011-04-14T17:40:04","slug":"kakskummend-viis-sorteerimine","status":"publish","type":"post","link":"https:\/\/python.pingviinitiivul.ee\/?p=306","title":{"rendered":"Kaksk\u00fcmmend viis: sorteerimine"},"content":{"rendered":"<p>Eelmisel korral vaatasime tunni l\u00f5pus kui aega \u00fcle j\u00e4i \u00fcht \u00fclesannet, mis osutus ootamatult keeruliseks.<br \/>\nTegu oli sorteerimisega. Nagu ma n\u00e4itasin, siis programmeerimiskeeltel on enamasti kaasas enda sorteerimisvahendid:<\/p>\n<p><code>sorted([5, 2, 3, 1, 4])<br \/>\n[1, 2, 3, 4, 5]<\/code><\/p>\n<p>Ehk siis kui meetodile sorted parameetriks anda m\u00f5ni nimekiri numbritest, siis sorted annab vastu v\u00e4iksemast suuremale j\u00e4rjekorras samad numbrid.<br \/>\nSamuti t\u00f6\u00f6tab sorteerimine teksti ja s\u00f5nadega, proovige n\u00e4iteks IDLE&#8217;s:<\/p>\n<p><code>sorted(\"See on test tekst mille kirjutas Adalbert\".split())<\/code><\/p>\n<p>.split() lahutab teksti (string, jutum\u00e4rkides) t\u00fchikute alusel s\u00f5nade j\u00e4rjekorraks.<br \/>\nsorted sorteerib s\u00f5nad vastavalt t\u00e4hestiku kooditabelile.<\/p>\n<p><strong>T\u00e4helepanu: arvestab ka suurt\u00e4hti ja see ei ole sama mis t\u00e4hestiku j\u00e4rjekord!<\/strong><br \/>\nN\u00e4iteks: &#8220;AAA ABB abb acc aaa ccc aBB abB BBB Ccc&#8221; sorteeritakse j\u00e4rjekorda &#8220;AAA ABB abb acc aaa ccc aBB abB BBB Ccc&#8221; &#8211; esmalt suurt\u00e4htedega algavad s\u00f5nad, siis v\u00e4iket\u00e4htedega algavad. P\u00f5hjuseks see, et kooditabelis on suurt\u00e4hed koos ja v\u00e4iket\u00e4hed koos, mitte l\u00e4bisegi. Lisaks on j\u00e4rjekorras ka erisusi, enamus sellest k\u00fcll kattub, aga t\u00e4pit\u00e4hed asuvad t\u00e4htede kooditabelites erinevas kohas ja seep\u00e4rast ei pruugi nad sattuda samasse kohta kus t\u00e4hestiku j\u00e4rgse sorteerimise korral nad olema peaks isegi siis kui t\u00e4htede suuruses erinevusi pole.<\/p>\n<p>N\u00e4iteks programm:<\/p>\n<p><code>#!\/usr\/bin\/python<br \/>\n# -*- coding: utf-8 -*-<br \/>\nsorteeritud = sorted(u\"\u00e4\u00e4\u00e4 \u00fc\u00fc\u00fc h\u00e4daldas Adalbert taga \u00f5ues \u00f6\u00f6sel \u017eurnalistika \u0160urikut parajat juurikat\".split())<br \/>\nfor tekst in sorteeritud:<br \/>\nprint tekst,<\/code><\/p>\n<p>Programmi vastus:<br \/>\nAdalbert h\u00e4daldas juurikat parajat taga \u00e4\u00e4\u00e4 \u00f5ues \u00f6\u00f6sel \u00fc\u00fc\u00fc \u0160urikut \u017eurnalistika<br \/>\nEesti t\u00e4hestik koos v\u00f5\u00f5rt\u00e4htedega:<br \/>\nABCDEFGHIJKLMNOPQRS\u0160Z\u017dTUVW\u00d5\u00c4\u00d6\u00dcXY<\/p>\n<p><strong>\u00d5 t\u00e4ht on kooditabelis peale \u00c4 t\u00e4hte ja enne \u00d6 t\u00e4hte ning ka \u0160 ja \u017d j\u00e4\u00e4vad eesti t\u00e4hestiku alusel valesse kohta.<\/strong><\/p>\n<p>Et sorteerimist parandada on Pythoni sorteerimisel p\u00e4ris head lisav\u00f5imalused, nimelt saab ette anda millise funktsiooni alusel sorteeritakse. N\u00e4iteks, et suur- ja v\u00e4iket\u00e4hti mitte eristada v\u00f5ib teha nii:<\/p>\n<p><code>sorteeritud = sorted(\"AAA ABB abb a\u00f6c \u00e4aa ccc aB\u00f5 abB BBB Ccc\".split(),  key=str.lower)<\/code><\/p>\n<p><em>key=str.lower<\/em> t\u00e4hendab, et enne sorteerimist tehakse m\u00f5tteliselt s\u00f5nad v\u00e4iket\u00e4htedesse tekstit\u00fc\u00fcbi str meetodiga lower.<\/p>\n<p>V\u00f5ib ka kasutada tagurpidi j\u00e4rjestamist, siis tuleb lisada parameetritesse, <em>key=str.lower<\/em> j\u00e4rele v\u00f5i asemele <em>reverse=1<\/em><\/p>\n<p>Python on lihtsalt kasutatav ja v\u00f5imas keel, kuid m\u00f5ned asjad k\u00e4ivad siin teistmoodi kui enamikus harjunumates vanemates keeltes. Olen vast juba maininud, et kui Pythonis v\u00f5ib j\u00e4rjekorras olla l\u00e4bisegi numbreid ja teksti v\u00f5i muid objekte, siis enamikus teistes keeltes selline asi lubatud ei ole. Eelmisel tunnil ise sorteerida proovides m\u00e4ngis ka see v\u00e4ikese vingerpussi.<\/p>\n<p>N\u00e4iteks v\u00f5ib Python sorteerida ka sedasi:<br \/>\n<code>sorted((1, 3, \"adalbert\", \"karu\", 7, -5))<\/code><\/p>\n<p>Vastuseks on: -5, 1, 3, 7, adalbert, karu<\/p>\n<p><strong>Mida siis ikkagi teha, et ise sorteerida?<\/strong><\/p>\n<p>K\u00f5ige lihtsam on k\u00e4ia nimekiri j\u00e4rjest l\u00e4bi &#8211; esmalt leida k\u00f5ige v\u00e4iksem liige ja lisada see uude jadasse, siis sellele j\u00e4rgnev v\u00e4ike liige ja nii edasi kuni koos on k\u00f5ik jada liikmed uues jadas (<a href=\"http:\/\/et.wikipedia.org\/wiki\/Valiksortimine\">valikuga sorteerimine<\/a>). See ei ole kindlasti matemaatiliselt ja praktiliselt k\u00f5ige kiirem ja efektiivsem viis sorteerida. No kujutame ette kuidas \u00f5pilaste pikkuse j\u00e4rgi sorteerimine k\u00e4ib kehalise kasvatuse tunnis v\u00f5i veelparem spordilaagris, kus \u00f5pilased pole varem \u00fcksteisega tuttavad ega tea kui pikk keegi on umbkaudugi. Parem on ilmselt alguses paaridel omavahel v\u00f5rrelda \u00fcksteist, siis paare omavahel ja nii edasi &#8211; paralleelselt. Sorteerimise kohta on hulgem omaette matemaatilisi teooriaid, ingliskeelses Wikipedias on v\u00e4ga <a href=\"http:\/\/en.wikipedia.org\/wiki\/Sorting_algorithm\">p\u00f5hjalik artikkel<\/a>. Eesti keeles on v\u00e4heseid selgitatud, kuid vaadake kindlasti <a href=\"http:\/\/et.wikipedia.org\/wiki\/Mullsortimine\">mullsorteerimist<\/a>, see vastabki ilmselt k\u00f5ige paremini \u00f5pilaste pikkusep\u00f5hisele ise sorteerimisele. V\u00f5ib uurida ka <a href=\"http:\/\/et.wikipedia.org\/wiki\/Vahelepanemisega_sortimine\">vahelepanemisega sorteerimist<\/a>.<\/p>\n<p>Ise sorteerimise \u00fclesande \u00fcks v\u00f5imalik versioon eelmise korra posti juurde:<\/p>\n<p><code>#!\/usr\/bin\/python<br \/>\n# -*- coding: utf-8 -*-<br \/>\nfail=open(\"KORD.SIS\", \"r\")<br \/>\nnumbrid = []<br \/>\nvastus = []<br \/>\nnumber=int(fail.readline()) #lugema veel numbri<br \/>\ntekstinumbrid=(fail.readline()).split() #lugema mitu numbrit realt tekstina<br \/>\nnumbrid = []<br \/>\nfor tekstn in tekstinumbrid:<br \/>\n&nbsp;&nbsp;&nbsp;    numbrid.append(int(tekstn))<br \/>\nwhile (len(numbrid)>0) :<br \/>\n&nbsp;&nbsp;&nbsp;    vaike = 100000<br \/>\n&nbsp;&nbsp;&nbsp;    for n in numbrid :<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        if (vaike > n) :<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;            vaike=n<br \/>\n&nbsp;&nbsp;&nbsp;    vastus.append(vaike)<br \/>\n&nbsp;&nbsp;&nbsp;    numbrid.remove(vaike)<br \/>\nfor i in vastus:<br \/>\n&nbsp;&nbsp;&nbsp;    print i, <\/code><\/p>\n<p>Viimaks \u00fcks keerulisem objektip\u00f5hine n\u00e4ide:<\/p>\n<p><code>#!\/usr\/bin\/python<br \/>\n# -*- coding: utf-8 -*-<br \/>\nclass Opilane:<br \/>\n&nbsp;&nbsp;&nbsp; def __init__(self, nimi, hinne, vanus):<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.nimi = nimi<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.hinne = hinne<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.vanus = vanus<br \/>\n&nbsp;&nbsp;&nbsp;def __repr__(self):<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return repr((self.nimi, self.hinne, self.vanus))<\/code><br \/>\n&nbsp;&nbsp;&nbsp;<br \/>\n<code> <\/code><\/p>\n<p><code>Opilased = [<br \/>\n&nbsp;&nbsp;&nbsp;Opilane('jaan', 'A', 15),<br \/>\n&nbsp;&nbsp;&nbsp;Opilane('mari', 'B', 12),<br \/>\n&nbsp;&nbsp;&nbsp;Opilane('art', 'B', 10),<br \/>\n]<br \/>\nprint Opilased<br \/>\nprint \"n\u00fc\u00fcd sorteerime!\"<br \/>\nprint sorted(Opilased, key=lambda Opilane: Opilane.nimi)<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eelmisel korral vaatasime tunni l\u00f5pus kui aega \u00fcle j\u00e4i \u00fcht \u00fclesannet, mis osutus ootamatult keeruliseks. Tegu oli sorteerimisega. Nagu ma n\u00e4itasin, siis programmeerimiskeeltel on enamasti kaasas enda sorteerimisvahendid: sorted([5, 2, 3, 1, 4]) [1, 2, 3, 4, 5] Ehk siis &hellip; <a href=\"https:\/\/python.pingviinitiivul.ee\/?p=306\">J\u00e4tka lugemist <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-306","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/python.pingviinitiivul.ee\/index.php?rest_route=\/wp\/v2\/posts\/306","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/python.pingviinitiivul.ee\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/python.pingviinitiivul.ee\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/python.pingviinitiivul.ee\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/python.pingviinitiivul.ee\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=306"}],"version-history":[{"count":10,"href":"https:\/\/python.pingviinitiivul.ee\/index.php?rest_route=\/wp\/v2\/posts\/306\/revisions"}],"predecessor-version":[{"id":314,"href":"https:\/\/python.pingviinitiivul.ee\/index.php?rest_route=\/wp\/v2\/posts\/306\/revisions\/314"}],"wp:attachment":[{"href":"https:\/\/python.pingviinitiivul.ee\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=306"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/python.pingviinitiivul.ee\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=306"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/python.pingviinitiivul.ee\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=306"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}