[Tutor PyCZ] razeni polozek ve slovniku

Petr Prikryl PrikrylP na skil.cz
Pátek Březen 17 09:58:57 CET 2006


Lukas Lisa napsal...
> daji se slovniky (dict) nejak radit jako seznamy (list)?
> ..podle klice nebo hodnoty popr. existuje nejaky 
> rozsirujici modul ktery by umoznoval nejakou
> pohodlnou praci se slovniky?

Seznam je datová struktura, ve které existuje jednoznačné
fyzické uspořádání položek. Pokud mám dvě položky, vždycky
můžu říct, která je v seznamu dříve a která později.

Slovník (vyhledávací tabulka) je určen k tomu, abych
na základě klíče co nejrychleji zpřístupnil související
hodnotu. Výstavba takových struktur prakticky nikdy 
nedefinuje nějaké pořadí. Pořadí položek může být různé,
podle toho jak o problému přemýšlím. Můžu ale vytvořit
(nebo si u speciálních variant slovníků vnitřně udržovat)
pomocné datové struktury, které budou zachycovat pořadí
položek podle mých představ.

Následující příklad uvádí možnosti získání položek
slovníků seřazených abecedně podle klíčů:


soubor a.py
=================================================================
d = { 'a1': 1, 
      'a2': 5, 
      'b1': 11, 
      'b7': 7, 
      'aa': 15, 
      'z': 333, 
      'aaa': 555 }

for k in d:
   print k, d[k]


print '-' * 70

for k in d.keys():
   print k, d[k]

print '-' * 70

for k in sorted(d.keys()):
   print k, d[k]


print '-' * 70

for k in sorted(d):
   print k, d[k]


print '-' * 70

klice = d.keys()
klice.sort()
for k in klice:
   print k, d[k]

=================================================================
Předpokládám verzi Pythonu 2.4 a vyšší. V nižších verzích nefunguje
sorted().

Při zápisu "for k in d:" se prochází přes všechny klíče, ale 
pořadí je určeno vnitřními vlastnostmi slovníku (nedá se o něm
říci nic bližšího). 

Zápis "d.keys()" vrací seznam všech klíčů slovníku ve stejném
pořadí, jako v předchozím případě. Zápis "for k in d.keys():"
funguje na první pohled stejně, jako předchozí, ale nejdříve
se fyzicky vytvoří seznam klíčů. První případ je tedy efektivnější.
Rozepsat se dá také jako "for k in d.iterkeys():" (to už je pro
začátečníky vyšší pilotáž ;).

Zabudovaná funkce sorted() vrací seřazenou kopii seznamu. 
Takže zápisy "for k in sorted(d.keys()):" nebo "for k in sorted(d):"
způsobí průchod všemi klíči slovníku v abecedním pořadí
(zde pracujeme s řetězci, takže abecedně).

Poslední případ ukazuje, jak se to muselo řešit v době
před Python 2.4, kdy neexistovala funkce sorted().

Průchod slovníkem seřazený podle hodnot prakticky
spočívá v tom, že vytvoříme seznam položek a ten
seřadíme podle hodnotové části. (V příkladu neuvedeno.)

Slovníky jsou dobré na to, aby se do nich něco vkládalo
podle klíče a velmi rychle podle klíče vyhledávalo. Pokud
mám ve slovníku N položek, pak se konkrétní položka vyhledá
na výrazně méně, než N kroků. U seznamu potřebuji v nejhorším
případě právě N kroků a průměrně (statisticky) N/2 kroků.

pepr


Další informace o konferenci Tutor