Python элегантная обратная функция int (строка, база)

python позволяет конвертировать строки из целых чисел с использованием любой базы в диапазоне [2,36], используя:

int(string,base) 

im ищет элегантную обратную функцию, которая принимает целое число и базу и возвращает строку

  • Как разделить список Python на два списка, в соответствии с некоторыми аспектами элементов
  • установить python Google Cloud Client на Ubuntu 14.04
  • Python: Я что-то упустил?
  • Как отсортировать словарь с ключами в виде строки чисел в Python
  • AttributeError: объект '_io.TextIOWrapper' не имеет атрибута 'next' python
  • Почему Google Search возвращает HTTP-ошибку 403?
  • например

     >>> str_base(224,15) 'ee' 

    У меня есть следующее решение:

     def digit_to_char(digit): if digit < 10: return chr(ord('0') + digit) else: return chr(ord('a') + digit - 10) def str_base(number,base): if number < 0: return '-' + str_base(-number,base) else: (d,m) = divmod(number,base) if d: return str_base(d,base) + digit_to_char(m) else: return digit_to_char(m) 

    note: digit_to_char () работает для баз данных <= 169 произвольно с использованием символов ascii после «z» в качестве цифр для оснований выше 36

    есть ли встроенная функция python, библиотечная функция или более элегантная обратная функция int (string, base)?

  • Как объявить длинную строку в Python?
  • В Python, почему функция может изменять некоторые аргументы, воспринимаемые вызывающим, но не другие?
  • Создание словаря с помощью клавиш и измененных объектов. Сюрприз
  • Как удалить пакет, установленный с помощью pip install --user
  • Как обнаружить, что код Python выполняется через отладчик?
  • Автоматическое преобразование вкладок pycharm в пространство
  • 9 Solutions collect form web for “Python элегантная обратная функция int (строка, база)”

    Этот поток имеет некоторые примеры реализации.

    На самом деле, я думаю, что ваше решение выглядит довольно красиво, оно даже рекурсивное, что здесь приятно.

    Я бы все же упростил его, чтобы удалить else , но это, вероятно, личное дело. Я думаю, что if foo: return очень ясен, и после этого не нужно, чтобы было ясно, что это отдельная ветка.

     def digit_to_char(digit): if digit < 10: return str(digit) return chr(ord('a') + digit - 10) def str_base(number,base): if number < 0: return '-' + str_base(-number, base) (d, m) = divmod(number, base) if d > 0: return str_base(d, base) + digit_to_char(m) return digit_to_char(m) 

    Я упростил случай 0-9 в digit_to_char() , я думаю, что str() более digit_to_char() , чем конструкция chr(ord()) . Чтобы максимизировать симметрию с аргументом >= 10 ord() можно было бы учесть, но я не беспокоился, так как это добавило бы линию, и краткость почувствовала себя лучше. 🙂

    Возможно, это не должно быть ответом, но это может быть полезно для некоторых: встроенная функция format преобразует числа в строку в нескольких базах:

     >>> format(255, 'b') # base 2 '11111111' >>> format(255, 'd') # base 10 '255' >>> format(255, 'o') # base 8 '377' >>> format(255, 'x') # base 16 'ff' 

    Если вы используете Numpy, существует numpy.base_repr .

    Вы можете прочитать код под numpy/core/numeric.py . Короткие и элегантные

    Вышеупомянутые ответы действительно приятные. Это помогло мне много прототипа альгортита, который мне пришлось реализовать на C

    Я хотел бы придумать небольшое изменение (я использовал) для преобразования десятичного числа в базу символьного пространства

    Я также игнорировал отрицательные значения только для краткости и тот факт, что математически неверно -> другие правила модульной арифметики -> другая математика, если вы используете двоичный, oct или hex -> diff в значениях unsigned и signed

     def str_base(number, base): (d,m) = divmod(number,len(base)) if d > 0: return str_base(d,base)+base[m] return base[m] 

    это приведет к следующему результату

     >>> str_base(13,'01') '1101' >>> str_base(255,'01') '11111111' >>> str_base(255,'01234567') '377' >>> str_base(255,'0123456789') '255' >>> str_base(255,'0123456789abcdef') 'ff' >>> str_base(1399871903,'_helowrd') 'hello_world' 

    если вы хотите использовать padd с символом нулевого знака, который вы можете использовать

     symbol_space = 'abcdest' >>> str_base(734,symbol_space).rjust(0,symbol_space[0]) 'catt' >>> str_base(734,symbol_space).rjust(6,symbol_space[0]) 'aacatt' 

    просмотрите это.

     def int2str(num, base=16, sbl=None): if not sbl: sbl = '0123456789abcdefghijklmnopqrstuvwxyz' if len(sbl) < 2: raise ValueError, 'size of symbols should be >= 2' if base < 2 or base > len(sbl): raise ValueError, 'base must be in range 2-%d' % (len(sbl)) neg = False if num < 0: neg = True num = -num num, rem = divmod(num, base) ret = '' while num: ret = sbl[rem] + ret num, rem = divmod(num, base) ret = ('-' if neg else '') + sbl[rem] + ret return ret 

    digit_to_char может быть реализована следующим образом:

     def digit_to_char(digit): return (string.digits + string.lowercase)[digit] 

    Я однажды написал свою собственную функцию с той же целью, но теперь смущающе сложно.

     from math import log, ceil, floor from collections import deque from itertools import repeat from string import uppercase, digits import re __alphanumerals = (digits + uppercase) class InvalidBaseError(ValueError): pass class FloatConvertError(ValueError): pass class IncorrectBaseError(ValueError): pass def getbase(number, base=2, frombase = 10): if not frombase == 10: number = getvalue(number, frombase) #getvalue is also a personal function to replicate int(number, base) if 1 >= base or base >= len(__alphanumerals) or not floor(base) == base: raise InvalidBaseError("Invalid value: {} entered as base to convert to. \n{}".format(base, "Assert that the base to convert to is a decimal integer.")) if isinstance(number, str): try: number = atof(number) except ValueError: #The first check of whether the base is 10 would have already corrected the number raise IncorrectBaseError("Incorrect base passed as base of number -> number: {} base: {}".format(number, frombase)) #^ v was supporting float numbers incase number was the return of another operation if number > floor(number): raise FloatConvertError("The number to be converted must not be a float. {}".format(number)) isNegative = False if number < 0: isNegative = True number = abs(number) logarithm = log(number, base) if number else 0 #get around number being zero easily ceiling = int(logarithm) + 1 structure = deque(repeat(0, ceiling), maxlen = ceiling) while number: if number >= (base ** int(logarithm)): acceptable_digit = int(number / (base ** floor(logarithm))) structure.append(acceptable_digit if acceptable_digit < 10 else __alphanumerals[acceptable_digit]) number -= acceptable_digit * (base ** floor(logarithm)) else: structure.append(0) logarithm -= 1 while structure[0] == 0: #the result needs trailing zeros structure.rotate(-1) return ("-" if isNegative and number else "") + reduce(lambda a, b: a + b, map(lambda a: str(a), structure)) 

    Я думаю, что функция strbase должна поддерживать только base> = 2 и <= 36, чтобы предотвратить конфликт с другими инструментами в python, такими как int. Кроме того, я думаю, что только один случай алфавитов должен использоваться предпочтительно в верхнем регистре, чтобы предотвратить конфликт с другими функциями, такими как int, поскольку он будет считать, что «a» и «A» равны 10.

     from string import uppercase dig_to_chr = lambda num: str(num) if num < 10 else uppercase[num - 10] def strbase(number, base): if not 2 <= base <= 36: raise ValueError("Base to convert to must be >= 2 and <= 36") if number < 0: return "-" + strbase(-number, base) d, m = divmod(number, base) if d: return strbase(d, base) + dig_to_chr(m) return dig_to_chr(m) 

    Небольшой поиск в Google приносит это . Один из комментариев рассказывает о встроенных функциях Python:

     int(x [,base]) converts x to an integer long(x [,base]) converts x to a long integer float(x) converts x to a floating-point number complex(real [,imag]) creates a complex number chr(x) converts an integer to a character unichr(x) converts an integer to a Unicode character ord(c) converts a character to its integer value hex(x) converts an integer to a hexadecimal string oct(x) converts an integer to an octal string 

    Но ни один из них не кажется правильным. Думаю, вам просто нужно закодировать свою собственную функцию. В ссылке есть пример кода.

    Вот моя душа

     def int2base(a, base, numerals="0123456789abcdefghijklmnopqrstuvwxyz"): baseit = lambda a=a, b=base: (not a) and numerals[0] or baseit(aa%b,b*base)+numerals[a%b%(base-1) or (a%b) and (base-1)] return baseit() 

    объяснение

    В любой базе каждое число равно a1+a2*base**2+a3*base**3... «Миссия» – найти все.

    Для каждого N=1,2,3... код изолирует aN*base**N путем «mouuling» на b для b=base**(N+1) которые разрезают все a больше N, и нарезать все а, что их серийный номер меньше N, уменьшая каждый раз, когда func вызывается текущей aN*base**N

    Base% (base-1) == 1 для базы ** p% (base-1) == 1 и для этого q * base ^ p% (base-1) == q с единственным исключением, когда q = base-1 который возвращает 0. Чтобы исправить это, если он возвращает 0, функция func проверяет, является ли это 0 от начала.


    преимущества

    в этом примере есть только одно умножение (вместо деления) и некоторые moudulueses, относительно относительно малое время.

    Python - лучший язык программирования в мире.