Alex Martelli wrote: > [EMAIL PROTECTED] <[EMAIL PROTECTED]> 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 -- http://mail.python.org/mailman/listinfo/python-list