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)