[python] Jak setridit dictionary

Petr Prikryl PrikrylP na skil.cz
Středa Říjen 10 13:59:43 CEST 2007


viz dole

> Ondrej Beran
> 2007/10/10, rajcze <rajcze na gmail.com>:
> > Myslim ze Ondrej hleda spis neco takovehoto
> >
> > slovnik = {1:'z', 2:'a', 3:'c'}
> > index_slovniku = slovnik.items()
> > index_slovniku.sort(lambda x,y: cmp(x[1],y[1]))
> > index_slovniku = map(lambda x: x[0], index_slovniku)
> 
> JJ, to je presne to, co jsem nedokazal vymyslet.
> Porad jsem nevedel jak docilit, aby se mi se tridenou hodnotou
> movenul/swapnul i klic
> 
> > urcite se to da napsat hezceji :)
> 
> Hlavne, kdyz to dela to, co potrebuju  -  analyzuju logy tj. seskupuji
> zavisle events a divam se na ne z ruznych pohledu.

Principiálně to moc jinak napsat nejde. Slovník se dle uživatelských 
potřeb vnitřně jinak uspořádávat nedá. Musí se to udělat zvenku, 
čili vytvořit pomocný seznam klíčů v pořadí, které odpovídá 
seřazeným hodnotám.

Abychom takový seznam hodnot získali, musíme nejdřív získat seznam
položek, kde každá položka obsahuje jak klíč, tak hodnotu. Tenhle
seznam se musí seřadit podle hodnotové části položek. Ze seznamu 
položek se pak můžou vybrat jen klíče ve stejném pořadí.

Pokud někdo nevyznává lambda, map a spol, může považovat následující
zápis za přehlednější:
=======================================
slovnik = {1:'z', 2:'a', 3:'c'}

def cmpPodleHodnot(a, b):
    return cmp(a[1], b[1])

polozky_slovniku = slovnik.items()
polozky_slovniku.sort(cmpPodleHodnot)
index_slovniku = [ klic for klic, hodnota in polozky_slovniku ]
=======================================

Pokud potřebujeme extrémně šetřit místem, pak bychom
měli hned zrušit seznam polozky_slovniku, což se v původním
řešení děje uvolněním reference při znovupoužití stejnojmenné
proměnné.

Pokud ale místem tak moc šetřit nepotřebujeme, pak klidně
můžeme zůstat u seznamu polozky_slovniku a seznam klíčů
vůbec nebudovat. Paměťově to bude jen velmi mírně náročnější.

pepr


Další informace o konferenci Python