[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