[Python-ideas] Add dict.getkey() and set.get()

Steven D'Aprano steve at pearwood.info
Sun Sep 15 01:07:57 CEST 2013

On Sat, Sep 14, 2013 at 09:52:30AM -0700, David Mertz wrote:

> def getexact(m, v):
>     for x in m:
>         if x==v: return x
>     else:
>         raise KeyError(v)

This has the flaw that it is O(N) rather than O(1). It's really quite 
unfortunate to have dicts and sets able to access keys in (almost) 
constant time, but not be able to communicate that key back to the 
caller except by walking the entire dict/set.

Now O(N) is tolerable if all you want to do is retrieve the canonical 
version of a single key. But if you want to do so for *all* of the keys 
in the dict, the naive way to do it ends up walking the dict for 
each key, giving O(N**2) in total. Is there a non-naive way to speed 
this up? I haven't had breakfast yet so I can't think of one :-)

My feeling here is that for ordinary dicts, needing to retrieve the 
canonical key is rare enough that they don't need a dedicated method to 
do so. But for the TransformDict suggested on the python-dev list, it 
will be a common need, and deserves an O(1) lookup method.


More information about the Python-ideas mailing list