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