Tartalmazásvizsgálat szótárban

A szótárakról szóló bevezető egységben ugyancsak említettük, hogy az in operátor is a szótár kulcsait vizsgálja. Ezt az ismeretet alkalmaztuk a listákból álló szótár felépítésekor is: ha az adott kulcs még nem szerepelt a szótárban, akkor új elemet (új listát) szúrtunk be az adott kulccsal; ha a kulcs már bennne volt a szótárban, akkor a hozzá tartozó listát bővítettük új elemmel.

Ezt az eljárást ismét alkalmazhatjuk, amikor az Anagramma című feladat ötödik lépéséhez építünk értékként listákat tartalmazó szótárat (inf_e_20101022_m_04): a szavak betűit abc-be rendezve (majd egy szóvá összefűzve) megkapjuk a kulcsot, az ehhez tartozó érték pedig az ugyanezen kulcsot adó szavak listája lesz (vagyis egy listában az összetartozó anagrammák szerepelnek).

Ha pedig elkészült az adatszerkezet, akkor a felhasználó által megadott szóról már könnyedén el tudjuk dönteni, hogy van-e anagrammája a feladatbeli szavak között:

_(5)

dl_w= {}
for word in l_ws:
    key= ''.join(sorted(word))
    if key in dl_w:
        dl_w[key]+=[word]
    else:
        dl_w[key]= [word]

wrd3= input('Kérem, adjon meg egy szót: ')
key= ''.join(sorted(wrd3))
if key in dl_w:
    for word in dl_w[key]:
        print(word)
else:
    print('Nincs a szótárban anagramma.')

Szélsőérték-kiválasztás szótárban

A következő lépés a leghosszabb szó (valamint annak anagrammáinak) kiválasztása. Mivel az anagrammát meghatározó kulcs (a szó betűinek abc-be rendezésével kapott szó) értelemszerűen ugyanolyan hosszú, mint az eredeti szó, kiválaszthatjuk a leghosszabbat e szavak közül is. És mivel a max() függvény egy szótár kulcsaival dolgozik, és ahogyan korábban láthattuk, a szó hosszúságát is megadhatjuk a rendezés szempontjaként, könnyűszerrel kiválaszthatjuk a leghosszabb anagrammát:

_(6)

maxk= len(max(dl_w, key= len))
for key in dl_w:
    if len(key)==maxk:
        for word in dl_w[key]:
            print(word)

Rendezés szótárban

Végül a szavak (tehát ismét csak az anagrammák) hossza szerint kell rendeznünk a szótár szavait. És mivel a sorted() függvény is a szótár kulcsait veszi figyelembe, ismét csak gyerekjáték a feladat igényei szerinti rendezés – csak az okozhat némi fejtörést, hogy az eredményt a kívánt formátumban írjuk ki (ügyelve arra, hogy se az adatok előtt, se azok után ne álljon felesleges üres sor, hasonlóképpen a sorok végére se tegyünk szóközt):

_(7)

prev_len= 0
with open('inf_e_20101022_m_04_rendezve.txt', 'w') as f:
    for key in sorted(dl_w, key= len):
        if len(key)!=prev_len and prev_len!=0:
            f.write('\n')
        for word in dl_w[key][:-1]:
            f.write(word + ' ')
        f.write(dl_w[key][-1])
        f.write('\n')
        prev_len= len(key)