Why are there no ordered dictionaries?

bonono at gmail.com bonono at gmail.com
Sun Nov 20 21:23:44 EST 2005


Alex Martelli wrote:
> bonono at gmail.com <bonono at gmail.com> wrote:
>    ...
> > there are at least two behaviour. What I need is a "preferred order".
> > Say if I have designed a web form(correspond to a database table), I
> > just want say 3 fields that goes before anything else in the
> > presentation. The rest I don't care as the DBA may create more fields
> > later which I don't want to then update my code yet again.
>
> preferred_fields = ['foo', 'bar', 'baz']
>
> def process_preferred_fields():
>     global preferred_fields
>     temp = {}
>     for i, field in enumerate(preferred_fields):
>         temp[field] = '%s%s' % (chr(0), chr(i))
>     preferred_fields = temp
> process_preferred_fields()
> del process_preferred_fields
>
> def sort_key(akey, preferred_fields=preferred_fields):
>     return preferred_fields.get(akey, akey)
> del preferred_fields
>
> ## ...build dictionary d...
>
> # now output d...:
> for k in sorted(d, key=sort_key):
>     print k, d[k]
>
> Season to taste if you want non-preferred fields emitted other than
> alphabetically, or if you want to wrap this stuff into a class, etc.
> (Note: untested code, so typos &c are quite possible).  This assumes
> that no 'real' key is a non-string, and no 'real' key starts with
> chr(0), but it's quite easy to tweak for slightly different specs (at
> worst by defining a custom type designed to always compare less than any
> real key, and wrapping the preferred_fields entry in instances of that
> custom type... having such instances compare with each other based on
> the index within preferred_fields of the key they're wrapping, etc etc).
>
Thanks. For me, I don't need such complex thing, it is just like :

d = somedict_from_db()
prefer=['f','a',b']

def my_order(d):
   for x in prefer:
     if x in d: yield x
   s = frozenset(prefer)
   for x in d:
     if x not in s: yield x




More information about the Python-list mailing list