在Python 3中将数字转换为不同进制

3

我想写一个函数,使我能够将一个数字从某种进制转换为另一种选择的进制,从二进制一直到三十进制。为了做到这一点,我首先需要将我的初始数字(以字符串形式给出)转换为十进制数,以便于进行进一步的转换。

然而,我的函数似乎有一个错误。

我现在拥有的是:

def decimal(number, base1):
    number_dec = 0
    val = '0123456789abcdefghijklmnopqrstuvwxyz'

    if base1 != 10:
        for digit in number[::-1]:
            factor = val.find(digit)
            for exp in range(0, len(number)):
                number_dec += factor * base1 **exp
    else:
        number_dec = number
    return number_dec

如果我输入,例如:
decimal('4d2', 16)

该函数返回的是“5187”,而不是正确的“1234”。错误在哪里?

对于五十一,给一个加一的操作就行了 :) - NPE
除非你是在做作业/自学等,否则内置的int函数已经可以实现这个功能:int('4d2', 16)返回1234int('4x3', 36)返回6375。(它只能工作到基数36,但是对于你的代码也是如此,如果“三十六进制”是你所需的极限,那么你就完成了。)而且,它可以处理大写字母和小写字母。 - abarnert
此外,如果 base1 != 10,你的代码返回一个整数,但如果是10,则返回一个字符串。这可能不是你想要的结果,对吗? - abarnert
这只是我的作业的一小部分,我确实需要解决一个更大的问题。但是我注意到函数会针对每个数字重复循环三次,正如NPE所指出的那样。这就是错误所在。 - Denny Nuyts
@DennyNuyts:没错,但如果base110,你只需要执行number_dec = number,然后返回该字符串。如果是其他任何值,则会在number_dec中计算一个整数并返回它。 - abarnert
显示剩余6条评论
1个回答

1

您为每个数字执行整个循环:

    for exp in range(0, len(number)):
        number_dec += factor * base1 **exp

如果您不必自己编写,您可以使用内置的设施:
In [2]: int('4d2', 16)
Out[2]: 1234

嗯,2 * 16^0 + 13 * 16^1 + 4 * 16^2 恰好等于 1234。三个十六进制数字。这就是我想让循环执行的内容。 - Denny Nuyts
我确实需要能够将我输入的任何数字从所有可能的进制转换。 - Denny Nuyts
@DennyNuyts:你又重复整个循环三次了。 - NPE
我明白了,你是指内部循环。天啊,谢谢你让我恍然大悟。哈哈,问题可能已经解决了。再次感谢。 - Denny Nuyts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接