Az SMS szavak című feladat befejező lépésében azt kell megállapítanunk, hogy melyik kódhoz tartozik a legtöbb szó; más megfogalmazásban tehát az a kérdés, hogy a szótár melyik kulcsához tartozik a legtöbb elemet tartalmazó lista, azaz a leghosszabb elem (inf_e_20070516_m_04).
Mivel most nem a kulcsok közül kell maximálisat választanunk (akár abc-be rendezést, akár hosszúságot vagy más effélét értve ezalatt), nincs kézenfekvő mód a python max() függvényének alkalmazására: a maximumkiválasztás klasszikus lépéseit alkalmazva be kell járnunk a szótár elemeit. Ahogyan korábban már szóba került, a listák esetén látott konstrukció a szótár kulcsain iterál; ezekből persze könnyedén előállíthatók a megfelelő értékek is:
_(9) maxl= 0 for code in dl_cw: if(len(dl_cw[code])) > maxl: maxc= code maxl= len(dl_cw[code]) print('A legtöbb szó a(z)', maxc, 'kódhoz tartozik.') print('A szavak:', ', '.join(dl_cw[maxc]))
A halmaz, a szótár felhasználási lehetőségeit jól illusztrálja az Anagramma című feladat is (inf_e_20101022_m_04). Az első lépésben egy szó különböző karaktereinek számát kell meghatároznunk; ennek ismét célszerű módja, ha a karaktereket egy halmazba gyűjtjük, majd megadjuk ennek elemszámát.
A kiírást végezhetjük a python régi stílusú, printf-szerű kiírásával is. Ekkor a print parancs első paramétere két részből áll: % után adjuk meg az első rész formázási karaktereibe helyettesítendő adatokat. A következő példában a %d helyére (tízes számrendszerben megjelenő) egész szám, a %s helyére string kerül:
_(1) word= input('Kérem, adjon meg egy szöveget: ') soch= {chr for chr in word} print('A szövegben %d különböző karakter található.' % len(soch)) print('E karakterek a következők: %s' % ', '.join(soch))
A szövegben természetesen szerepelhet több formázási karakter is, ilyenkor a % után egy vektorban kell megadni a behelyettesítendő értékeket. Ennek magyarázata az, hogy mindvégig a print parancs első argumentumáról van szó; valójában a % itt egy operátor, amely a formázásra szolgáló stringből és egy vektorból új stringet állít elő (azaz –meglehetősen zavaró módon– a % két különböző helyzetben két különböző funkcióban jelenik meg):
>>> '%d+%d' % (2, 3) '2+3' >>> '%s és %s' % ('selmecz-', 'bélabánya') 'selmecz- és bélabánya'
A következő két lépésben az állományból beolvasott szavakból listát építünk, majd ennek elemeit (azaz a stringeket) rendezzük, az így kapott lista karaktereit a .join() metódus segítségével összefűzzük, végül a most megismert módon egy sorvégjellel ellátva kiírjuk a létrehozandó állományba:
_(2) print('A szotar.txt állomány adatainak olvasása…') l_ws= [line.strip() for line in open('inf_e_20101022_m_04_szotar.txt')] _(3) print('Az abc.txt állomány adatainak írása…') with open('inf_e_20101022_m_04_abc.txt', 'w') as f: for word in l_ws: f.write('%s\n' % ''.join(sorted(word)))
A negyedik lépésben a karakterek rendezett listájának egyenlőségét vizsgálva döntjük el, hogy két szó anagramma-e:
_(4) wrd1= input('Kérem, adjon meg egy szót: ') wrd2= input('Kérem, adjon meg még egy szót: ') if sorted(wrd1)==sorted(wrd2): print('Anagramma.') else: print('Nem anagramma.')