'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 1:[1]
You are apparently confusing numbers with the representation of numbers.
A number does not have a base... it's the number representation that has a base... for example the number represented as "101" in base 2 is the same as the number represented with "5" in base 10.
The range
function will count successive numbers, and you can get their representation in any base you like with something like:
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def int2str(x, base):
if x < 0:
return "-" + int2str(-x, base)
return ("" if x < base else int2str(x//base, base)) + digits[x % base]
Solution 2:[2]
You can not crate integers with special based, but you can create your expected numbers in a specified base in string :
def my_range(start,end,base,step=1):
def Convert(n,base):
string = "0123456789ABCDEF"
if n < base:
return string[n]
else:
return Convert(n//base,base) + string[n%base]
return (Convert(i,base) for i in range(start,end,step))
Demo:
print list(my_range(4,20,2))
['100', '101', '110', '111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111', '10000', '10001', '10010', '10011']
Note that the passed string string = "0123456789ABCDEF"
to function will works till base 16
, if want to calculate greater based you can use more letters.
Solution 3:[3]
You could do this with the itertools product function.
from itertools import product
def countUp(start, end, base):
n_digits = len(end)
combs = product(*[range(base)] * n_digits)
while (n := next(combs)) <= end:
yield n
list(countUp(start=0, end=(2, 0), base=3))
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0)]
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | 6502 |
Solution 2 | |
Solution 3 | Bill |