Comment puis-je obtenir la chaîne suivante, en ordre alphanumérique, en Python?

StackOverflow https://stackoverflow.com/questions/932506

  •  06-09-2019
  •  | 
  •  

Question

je besoin d'un programme simple qui donne une chaîne, me revient à la suivante dans l'ordre alphanumérique (ou tout simplement l'ordre alphabétique).

f("aaa")="aab"
f("aaZ")="aba"

Et ainsi de suite.

Y at-il une fonction pour cela dans l'un des modules déjà?

Était-ce utile?

La solution

Je ne pense pas qu'il y ait une fonction intégrée pour le faire. Ce qui suit devrait fonctionner:

def next_string(s):
    strip_zs = s.rstrip('z')
    if strip_zs:
        return strip_zs[:-1] + chr(ord(strip_zs[-1]) + 1) + 'a' * (len(s) - len(strip_zs))
    else:
        return 'a' * (len(s) + 1)

Explication: vous trouvez le dernier caractère qui n'est pas z, incrémenter et remplacer tous les caractères après avec des années a. Si la chaîne entière est des années z, puis retourner une chaîne de tous les années a qui est un plus.

Autres conseils

Les réponses sont à Comment voulez-vous traduire cette de Perl à Python? suffisante? Pas 100% ce que vous demandez, mais fermer ...

Un autre, plus long, mais peut-être une solution plus lisible et flexible:

def toval(s):
    """Converts an 'azz' string into a number"""
    v = 0
    for c in s.lower():
        v = v * 26 + ord(c) - ord('a')
    return v

def tostr(v, minlen=0):
    """Converts a number into 'azz' string"""
    s = ''
    while v or len(s) < minlen:
        s = chr(ord('a') + v % 26) + s
        v /= 26
    return s

def next(s, minlen=0):
    return tostr(toval(s) + 1, minlen)

s = ""
for i in range(100):
    s = next(s, 5)
    print s

Vous convertissez la chaîne dans un numéro où chaque lettre représente un chiffre dans la base 26, augmenter le nombre par un et convertir le nombre de nouveau dans la chaîne. De cette façon, vous pouvez faire des calculs arbitraires sur les valeurs représentées sous forme de chaînes de lettres.

Le 'contrôle des paramètres' MinLEN '' combien de chiffres le résultat aura (depuis 0 == un AAAAA ==).

Sucks que python n'a pas ce que Ruby a: String#next Alors, voici une solution merdique pour faire face à des chaînes alpha-numérique:

def next_string(s):
  a1 = range(65, 91)  # capital letters
  a2 = range(97, 123) # letters
  a3 = range(48, 58)  # numbers
  char = ord(s[-1])
  for a in [a1, a2, a3]:
    if char in a:
      if char + 1 in a:
        return s[:-1] + chr(char + 1)
      else:
        ns = next_string(s[:-1]) if s[:-1] else chr(a[0])
        return ns + chr(a[0])

print next_string('abc')  # abd
print next_string('123')  # 124
print next_string('ABC')  # ABD

# all together now
print next_string('a0')   # a1
print next_string('1a')   # 1b
print next_string('9A')   # 9B

# with carry-over
print next_string('9')    # 00
print next_string('z')    # aa
print next_string('Z')    # AA

# cascading carry-over
print next_string('a9')   # b0
print next_string('0z')   # 1a
print next_string('Z9')   # AA0

print next_string('199')  # 200
print next_string('azz')  # baa
print next_string('Zz9')  # AAa0

print next_string('$a')   # $b
print next_string('$_')   # None... fix it yourself

Pas grand. fonctionne un peu pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top