297 votes

convertir un entier en chaîne dans une base numérique donnée en python

Python permet de faciliter la création d'un entier à partir d'une chaîne de base par

int(str,base). 

Je veux faire l'inverse: la création d'une chaîne à partir d'un entier. c'est à dire je veux une fonction int2base(num,base)
tels que:

int( int2base( X , BASE ) , BASE ) == X 

le nom de la fonction/l'argument de l'ordre est sans importance

Pour tout nombre X et de base de BASE que int() accepte.

C'est une simple fonction pour écrire -- en fait plus facile que de les décrire cette question-pourtant, je sens que je dois être en manque de quelque chose.

Je sais que sur les fonctions bin,oct,hex; mais je ne peut pas les utiliser pour quelques raisons:

  • Ces fonctions ne sont pas disponibles sur les anciennes versions de python avec qui j'ai besoin de compatibilité (2.2)
  • Je veux une solution générale qui peut être appelé de la même manière pour les différentes bases
  • Je veux permettre à des bases autres que 2,8,16

Liées

115voto

Alex Martelli Points 330805

Si vous avez besoin de la compatibilité avec les anciennes versions de Python, vous pouvez soit utiliser gmpy (qui n'inclut pas une rapide, complètement général int-à-conversion de chaîne de caractères la fonction, et peut être construit pour ces anciennes versions -- vous devrez peut-être essayer des versions plus anciennes, depuis les plus récentes n'ont pas été testés pour la vénérable Python et GMP libère, seulement un peu plus récente), ou, pour les moins de vitesse mais plus de commodité, utilisez le code Python -- par exemple, plus simplement:

import string
digs = string.digits + string.lowercase

def int2base(x, base):
  if x < 0: sign = -1
  elif x==0: return '0'
  else: sign = 1
  x *= sign
  digits = []
  while x:
    digits.append(digs[x % base])
    x /= base
  if sign < 0:
    digits.append('-')
  digits.reverse()
  return ''.join(digits)

113voto

kottenator Points 1298
"{0:b}".format(100) # bin: 1100100
"{0:x}".format(100) # hex: 64
"{0:o}".format(100) # oct: 144

100voto

jellyfishtree Points 853
 def baseN(num,b,numerals="0123456789abcdefghijklmnopqrstuvwxyz"):
    return ((num == 0) and numerals[0]) or (baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b])
 

ref: http://code.activestate.com/recipes/65212/

21voto

Mark Borgerding Points 2259

Excellentes réponses! Je suppose que la réponse à ma question était "non". Je ne manquais pas d'une solution évidente. Voici la fonction que je vais utiliser pour condenser les bonnes idées exprimées dans les réponses.

  • autoriser le mappage de caractères fourni par l'appelant (autorise l'encodage en base64)
  • vérifie négatif et zéro
  • mappe des nombres complexes en tuples de chaînes

% -% +% -%

14voto

semente Points 1274

Vous pouvez utiliser baseconv.py: https://bitbucket.org/semente/baseconv

Exemple d'utilisation:

 >>> from baseconv import BaseConverter
>>> base20 = BaseConverter('0123456789abcdefghij')
>>> base20.encode(1234)
'31e'
>>> base20.decode('31e')
'1234'
>>> base20.encode(-1234)
'-31e'
>>> base20.decode('-31e')
'-1234'
>>> base11 = BaseConverter('0123456789-', sign='$')
>>> base11.encode('$1234')
'$-22'
>>> base11.decode('$-22')
'$1234'
 

Il existe des convertisseurs bultin comme par exemple baseconv.base2 , baseconv.base16 et baseconv.base64 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X