xrange not hashable - why not?

Sean Ross sross at connectmail.carleton.ca
Sun Jan 25 17:08:26 CET 2004


"Gerrit Holl" <gerrit at nl.linux.org> wrote in message
news:mailman.764.1075042048.12720.python-list at python.org...
> Hi,
>
> why is an xrange object not hashable?


I don't know the answer for this.


> I was trying to do something like:
>
> comments = {
>     xrange(0, 4): "Few",
>     xrange(4, 10): "Several",
>     xrange(10, 100): "A lot",
>     xrange(100, sys.maxint): "Can't count them"}
> for (k, v) in comments.items():
>     if n in k:
>         commentaar = v
>         break

There's a bit of an efficiency issue with using 'n in k' for something like
xrange(100, sys.maxint),
since you have to walk through the items in that range to see if n is in
there, and that's a large range.
Perhaps this would help:

class bounds:
    def __init__(self, start, stop, step=1):
        self.start = start
        self.stop = stop
        self.step = step
    def is_step(self, other):
            q, r = divmod(other-self.start, self.step)
            return r == 0
    def __contains__(self, other):
        return self.start <= other < self.stop and self.is_step(other)
    def __hash__(self):
        return id(self)
    def __repr__(self):
        return "bounds(start=%s, stop=%s, step=%s)"%\
               (self.start, self.stop, self.step)

import sys
import random

comments = {
    bounds(0, 4): "Few",
    bounds(4, 10): "Several",
    bounds(10, 100): "A lot",
    bounds(100, sys.maxint): "Can't count them"}

n = random.randint(0, sys.maxint)
print n

for k, v in comments.iteritems():
    print k
    if n in k:
        print v
        break
else:
    print n, "out of bounds"

HTH,
Sean





More information about the Python-list mailing list