Why aren't OrderedDicts comparable with < etc?

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Mon Jul 20 10:00:30 EDT 2009


On Mon, 20 Jul 2009 09:34:24 +0000, Sion Arrowsmith wrote:

> Terry Reedy  <tjreedy at udel.edu> wrote:
>>Sion Arrowsmith wrote:
>>> Jack Diederich  <jackdied at gmail.com> wrote:
>>>> It isn't an OrderedDict thing, it is a comparison thing.  Two regular
>>>> dicts also raise an error if you try to LT them.
>>> Python 2.5.2
>>>>>> d1 = dict((str(i), i) for i in range (10)) d2 = dict((str(i), i)
>>>>>> for i in range (20)) d1 < d2
>>> True
>>Try reversing the definitions of d1 and d2. The dicts are probably being
>>compared by id (address), which is the 2.x CPython default.
> 
> Like this?
> 
>>>> d1 = dict((str(i), i) for i in range (20)) 
>>>> d2 = dict((str(i), i) for i in range (10))
>>>> d1 < d2
> False
>>>> id(d1) < id(d2)
> True
> 
> I didn't know that comparison for anything other than equality defaulted
> to using id. That really is rather broken, and I'm glad 3.0 fixed it.


I don't think comparisons other than equality use id. That would be 
rather insane. If anyone can demonstrate such comparisons in a built-in 
or standard library class, I'd like to see it.


For the record, dicts have been comparable with < and > since at least 
Python 1.5:

$ python1.5
Python 1.5.2 (#1, Apr  1 2009, 22:55:54)  [GCC 4.1.2 20070925 (Red Hat 
4.1.2-27)] on linux2
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>>
>>> {1: 'a', 2: 'b'} < {2: 'b', 3: 'a'}
1


Reading the docs:

http://docs.python.org/library/stdtypes.html#comparisons
http://docs.python.org/library/stdtypes.html#mapping-types-dict

I can only suggest that dicts compare in an arbitrary but consistent 
fashion. What that is based on, I don't know, but based on some very 
limited testing, I'd guess it is like this:

If the two dicts have unequal length, the longer dict compares greater 
than the shorter dict.

If the two dicts are equal in length, (key, item) pairs are compared, 
probably in lexicographic order, because the order of insertion of keys 
doesn't appear to matter.


-- 
Steven



More information about the Python-list mailing list