[Python-ideas] ordered dict

Josiah Carlson jcarlson at uci.edu
Fri Apr 20 18:23:54 CEST 2007


Mathias Panzenböck <grosser.meister.morti at gmx.net> wrote:
> 
> Some kind of ordered dictionary would be nice to have in the
> standard library. e.g. a AVL tree or something like that.
> It would be nice so we can do things like that:
> 
> for value in tree[:end_key]:
> 	do_something_with(value)
> 
> del tree[:end_key]
> 
> 
> A alternative would be just to sort the keys of a dict but
> that's O( n log n ) for each sort. Depending on what's the more
> often occurring case (lookup, insert, get key-range, etc.) a
> other kind of dict object would make sense.
> 
> What do you think?

This has been brought up many times.  The general consensus has been
'you don't get what you think you get'.

    >>> u'a' < 'b' < () < u'a'
    True

That is to say, there isn't a total ordering on objects that would make
sense as a sorted key,value dictionary.  In Python 3.0, objects that
don't make sense to compare won't be comparable, so list.sort() and/or
an AVL tree may make sense again.

However, the problem with choosing to use an AVL (Red-Black, 2-3, etc.)
tree is deciding semantics.  Do you allow duplicate keys?  Do you allow
insertion and removal by position?  Do you allow the fetching of the
key/value at position X?  Do you allow the fetching of the position for
key X?  Insertion before/after (bisect_left, bisect_right equivalents).
Etcetera.

In many cases, using a sorted list gets you what you want, is almost as
fast, and has the benefit of using less memory.


 - Josiah




More information about the Python-ideas mailing list