Search code examples
pythonrangeradix

Count upward in python with variable base


I would like to know how to do an equivalent of the range function in python, but with the ability to specify the base number. For example:

countUp(start=0, end=1010, base=2)
countUp(start=0, end=101, base=3)
countUp(start=0, end=22, base=4)

Example output for base 2 counting:

[0, 1, 10, 11, 100, ...]

Is there a function I'm missing that does this? Or what could I do instead?


Solution

  • You can do it with a custom iterator:

    I took the iterater code from here and the base conversion from here

    import string
    class BaseRange:
        def __init__(self, low, high, base):
            digs = string.digits + string.letters
            self.current = low
            self.high = high
            self.base = base
        def __iter__(self):
            return self
        def next(self):  # Python 3 requires this to be __next__
            if self.current > self.high:
                raise StopIteration
            else:
                self.current += 1
                return self.int2base(self.current - 1, self.base)
        def int2base(self, x, base):
            if x < 0: sign = -1
            elif x == 0: return digs[0]
            else: sign = 1
            x *= sign
            digits = []
            while x:
                digits.append(digs[x % base])
                x /= base
            if sign < 0:
                digits.append('-')
                digits.reverse()
            return ''.join(digits)
    

    A Few Example runs produces:

    >>> for c in BaseRange(0, 10, 2):
        print(c)
    
    
    0
    1
    01
    11
    001
    101
    011
    111
    0001
    1001
    0101
    >>> for c in BaseRange(0, 10, 3):
        print(c)
    
    
    0
    1
    2
    01
    11
    21
    02
    12
    22
    001
    101