Why are there no ordered dictionaries?

Bengt Richter bokr at oz.net
Mon Nov 21 18:31:59 EST 2005


On 20 Nov 2005 21:12:52 -0800, "bonono at gmail.com" <bonono at gmail.com> wrote:

>
>Bengt Richter wrote:
>> On Sun, 20 Nov 2005 22:03:34 +0100, Christoph Zwerschke <cito at online.de> wrote:
>> >> Ordering the keys isn't the normal case, and can be done easily when
>> >> needed.
>> >
>> >That depends. Maybe I do not want the keys to be sorted alphabetically,
>> >but according to some criteria which cannot be derived from the keys
>> >themselves.
>> You mean involving also the values? What's wrong with
>>     sorted(plaindict.items(), key=your_ordering_function) ?
>>
>Not according to the content of the data, not just the "key". Or in
>other words, some other metadata that is not present in the data. A
>typical thing, like order of creation. Or some arbitary order. For
>example :
>
>I present a data grid/table in a HTML form and the user just drag and
>drop and rearrange the columns order.
          ^^[1]
[1] implies known info of before and after rearrangement. Where do these
come from, and are the two states expressed as ordered sets of keys generated and stored somewhere?
The point is, to re-order, you need a mapping from unordered data dict keys to values which the sorted
builtin function will order in the way you want. (BTW, if you use DSU, make sure the data is not modifying
your sort in an undesired way. Passing a key function to sorted makes it easy to exclude unwanted data from
the sort). If you have data that determines a new ordering of keys, it has to be accessed somehow, so
you just need to make it accessible to a handy helper that will generate your key function. E.g,
with before and after lists of keys expressing e.g. drag-drop before and after orderings, lambda can do the
job of getting you dict items in the new order, e.g., where bef and aft are lists that define the desired orderings
before and after in the sense of sort_precedence = bef.index[key_in_bef] and same for aft.

    sorted(thedict.items(),key=lambda t:dict(zip(bef,((k in aft and aft.index(k) or len(aft)+bef.index(k)) for k in bef))[t[0]])

Ok, that one-liner grew a bit ;-)
>
>Of course, you may say, just put another column that represent
>this(some reporting programs I have seen do it this way) and that is an
>option but not the only option.
>
Maybe you could keep the rearranged_keys vector in a per-user cookie, if it's a web app
and amounts to a user personalization?

( posting delayed >12 hrs due to news server prob ;-/ )

Regards,
Bengt Richter



More information about the Python-list mailing list