преобразование строки в базе больше 10 в python 3

Как и в теме, я работаю над полосой для преобразования строк в значения. когда основание меньше 10:

s = "" # string for example: "123", "a2b"
base = int() #2,10, 16, 32
a = len(s)
for i, j in zip(s[::-1], range(0, a)):
    x += int(i)*base**int(j)
print (x)

но для оснований больше 10 я понял, что цифры будут представлены как 1, ..... 10, a, b, c, d, ..., j, ... Мой скрипт не будет работать, так как буква не присваивается никакого значения. Я также понимаю, что int(s, base) решит мою проблему, но я ищу решение для своего сценария.


person derec    schedule 17.09.2017    source источник
comment
Вы правы в том, что не можете использовать int, но вы можете просто посмотреть эти значения в словаре, сопоставив букву со значением. Например, import string; print(dict(enumerate(string.ascii_lowercase, 10))).   -  person jonrsharpe    schedule 17.09.2017


Ответы (1)


Вы можете использовать enumerate вместо zip и range.

Вы можете использовать dict для преобразования символа в int:

>>> {c:i for i,c in enumerate('0123456789abcdef')}
{'a': 10, 'c': 12, 'b': 11, 'e': 14, 'd': 13, 'f': 15, '1': 1, '0': 0, '3': 3, '2': 2, '5': 5, '4': 4, '7': 7, '6': 6, '9': 9, '8': 8}

Например, для базы 16:

s = "abc"
base = 16
x = 0
hexa_table = {c:i for i,c in enumerate('0123456789abcdef')}
for i, c in enumerate(s[::-1]):
    x += hexa_table.get(c)*base**i
print(x)
# 2748

Что кажется правильным результатом:

>>> int("abc", 16)
2748

Вы также можете использовать sum для еще более короткого кода:

print(sum(hexa_table.get(c)*base**i for i, c in enumerate(s[::-1])))
# 2748
person Eric Duminil    schedule 17.09.2017
comment
@derec: С удовольствием. Не стесняйтесь принять ответ, чтобы показать, что он ответил на ваш вопрос. - person Eric Duminil; 18.09.2017