Rendezés II.

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