A python nem csak a stringek, listák, vektorok elemeinek rendezését biztosítja: a sorted() függvényt alkalmazhatjuk stringek, listák, vektorok sokaságának rendezéséhez is.
A fenti mondat értelmezéséhez érdemes közelebbről szemügyre venni például a stringek és a listák esetét.
Természetesnek tartjuk, hogy stringek halmaza (vagy listája) rendezhető, ehhez képest általában erőltetettnek tűnik, ha a stringet alkotó karaktereket akarjuk rendezni:
>>> sorted({'tűr', 'szűr', 'gyűd', 'gyűrűfű', 'gyűgy', 'gyűrűs'}) ['gyűd', 'gyűgy', 'gyűrűfű', 'gyűrűs', 'szűr', 'tűr'] >>> sorted(['tűr', 'szűr', 'gyűd', 'gyűrűfű', 'gyűgy', 'gyűrűs']) ['gyűd', 'gyűgy', 'gyűrűfű', 'gyűrűs', 'szűr', 'tűr'] >>> sorted('gyűrűfű') ['f', 'g', 'r', 'y', 'ű', 'ű', 'ű']
Listák esetén éppen fordított a helyzet: természetesnek tartjuk, hogy a listát alkotó elemek rendezhetők, miközben egyáltalán nem nyilvánvaló, hogy listák listáját is rendezhetjük:
>>> sorted(['hím', 'nyír', 'csíz']) ['csíz', 'hím', 'nyír'] >>> sorted([['tűr', 'gyűgy', 'gyűrűs'], ['szűr', 'gyűd', 'gyűrűfű'], ['hím', 'nyír', 'csíz']]) [['hím', 'nyír', 'csíz'], ['szűr', 'gyűd', 'gyűrűfű'], ['tűr', 'gyűgy', 'gyűrűs']]
A listák rendezése –éppúgy, mint a stringeké– lexikografikus: ha az alkotóelemek közül az elsők különböznek, akkor ezek határozzák meg a listák sorrendjét, ha ezek azonosak, akkor a második elemeket kell összehasonlítani és így tovább.
Amint láthatjuk, a rendezés nem veszi figyelembe a nyelvi sajátosságokat (meg sem adtuk, milyen abc szerint rendeznénk); alapértelmezés szerint a unicode-kódok határozzák meg a sorrendet.
Ez a rendezési lehetőség remekül felhasználható a Futár című feladat megoldásához (inf_e_20120514_m_04), ahol az egyes utak adatait tárolhatjuk háromelemű listában (a kezdő elem a nap sorszáma, a következő a napon belüli sorszám). Így a hét első, illetve utolsó fuvarjának adatait könnyedén leolvashatjuk a listák (rendezett) listájának elejéről, illetve végéről.
_(1) print('A tavok.txt állomány adatainak olvasása…') file= open('inf_e_20120514_m_04_tavok.txt') lst = [[int(str) for str in line.split()] for line in file] _(2) srt= sorted(lst) print('A hét legelső útja kilométerben:', srt[0][2]) _(3) print('A hét utolsó útja kilométerben:', srt[-1][2])
A harmadik lépésben azt kellett megadni, hogy mely napokon nem dolgozott a futár. Ehhez érdemes lehet egy halmazban összegyűjteni azon napok sorszámát, amikor volt feladata: így a hét minden munkanapját tartalmazó halmaz és az imént létrehozott halmaz különbsége épp megadja a feladat kérdésre a választ.
_(4) s07= {i for i in range(1, 8)} sod= set() for i in range(len(lst)): sod|= {lst[i][0]} print('A hét következő napjain nem dolgozott a futár: ', end='') for i in range(1, 8): if i not in sod: print(i, end=' ') print() # print(s07-sod) # print(sorted(s07-sod))
Figyeljük meg a (tesztelésre szolgáló) záró kiírások eredményét: s07-sod halmaz (hiszen két halmaz különbsége), de a rendezés után már listát látunk (hiszen ha az eredmény halmaz lenne, annak rögtön elveszne a rendezettsége).