^
is the 按位异或运算符 https://docs.python.org/3/reference/expressions.html#binary-bitwise-operations,而不是幂运算符。在Python中幂运算符是** https://docs.python.org/3/reference/expressions.html#the-power-operator:
s = number[i] * (int(base) ** length)
还有其他错误;s += s
简直就是s *= 2
,您将那里的数字加倍。你可能想从s = 0
outside然后循环求和:
s = 0
for i in range(len(number)):
length = length - 1
"""Computes the sum for each digit"""
s += number[i] * (int(base) ^ length)
但你没有转换number[i]
到那里的实际数值。
您需要在此处从“数字”到数值的映射:
digits = {c: i for i, c in enumerate('0123456789abcdefghijklmnopqrstuvwxyz')}
这创建了一个从字符串数字到数值的字典映射,所以'7'
映射到7
and f
映射到 15 等,为您提供一直到基数 36 的映射。
现在你可以使用digits
从字符串数字映射到数值:
s = 0
base = int(base)
for i, digit in enumerate(reversed(number.lower())):
s += digits[digit] * (base ** i)
我在这里反转了数字的处理;从小到大更容易。enumerate()
给我们一个索引计数,你可以循环directly over number
产生字符,而不是使用range()
并索引到number
。我小写number
以便a
and A
两者的意思都是10
在那么高的基地。
然后可以将其转换为函数中的单行代码:
digits = {c: i for i, c in enumerate('0123456789abcdefghijklmnopqrstuvwxyz')}
def parse_number(number, base):
return sum(digits[digit] * (base ** i)
for i, digit in enumerate(reversed(number.lower())))
print(parse_number(number, int(base)))