Iteráció szótárban

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

Formázott kiírás

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