Как базовые 37 чисел представляются как строки в Python? - PullRequest
0 голосов
/ 07 ноября 2019

Следующее работает нормально:

num = int("python", base=36)

Это работает, потому что, поскольку base 36 охватывает символы 0-9 и a-z

Однако, какую строку, s, я бынеобходимо представить десятичное значение 97878380023034 таким, что

int(s, base=37) == 97878380023034

Ответы [ 3 ]

1 голос
/ 07 ноября 2019
>>> int("0", base=37) 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: int() base must be >= 2 and <= 36, or 0

Это не так. Функция CPython int() явно проверяет , что ((base != 0 && base < 2) || base > 36), и выдает ошибки, если это возвращает true.

1 голос
/ 07 ноября 2019

https://docs.python.org/3/library/functions.html#int:

Если x не является числом или если задано base , то x должно бытьстрока, bytes или bytearray экземпляр, представляющий целочисленный литерал в основаниях основание . По желанию, литералу может предшествовать + или - (без пробела между ними) и он должен быть окружен пробелом. Литерал base-n состоит из цифр от 0 до n-1, где значения от a до z (или от A до Z) имеют значения от 10 до 35. Значение по умолчанию base равно 10. Допустимые значения: 0 и 2–36. Литералы Base-2, -8 и -16 могут быть опционально добавлены с префиксом 0b / 0B, 0o / 0O или0x / 0X, как с целочисленными литералами в коде. База 0 означает интерпретацию точно как литерал кода, так что фактическая база равна 2, 8, 10 или 16, и поэтому int('010', 0) недопустимо, в то время как int('010') так же, как int('010', 8).

(жирным шрифтом добавлено) (Спасибо https://euangoddard.github.io/clipboard2markdown/ за упрощение цитирования форматированного текста.)

0 голосов
/ 07 ноября 2019

вам нужно определить, что использовать для этой новой 37-й цифры. обратите внимание, что Python этого не делает, я думаю, потому что это довольно необычная задача и / или не существует ни одного, очевидно, хорошего выбора. предполагая, что вы в порядке с придумыванием чего-то, мы можем сделать:

def int_digits(value, digits):
    base = len(digits)
    result = []
    while value:
        value, r = divmod(value, base)
        result.append(digits[r])
    return ''.join(reversed(result))

int_digits(97878380023034, '0123456789abcdefghijklmnopqrstuvwxyzX')

, что дает мне rw1f4pXo6. обратите внимание на наличие X, которое указывает, что здесь нужна была 37-ая цифра, но я полагаю, что вы выбрали этот пример, чтобы он

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...