Comment puis-je obtenir la chaîne suivante, en ordre alphanumérique, en Python?
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à?
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.