Come posso ottenere la stringa seguente, in ordine alfanumerico, in Python?
Domanda
Ho bisogno di un semplice programma che data una stringa, ritorna a me il prossimo nell'ordinamento alfanumerico (o semplicemente l'ordine alfabetico).
f("aaa")="aab"
f("aaZ")="aba"
E così via.
C'è una funzione per questo in uno dei moduli già?
Soluzione
Non credo che ci sia una funzione incorporata per effettuare questa operazione. Il seguente dovrebbe funzionare:
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)
Spiegazione: a trovare l'ultimo carattere che non è un z
, incrementarlo, e sostituire tutti i caratteri dopo con a
di. Se l'intera stringa è z
di, poi restituire una stringa di tutti a
di che è uno più lungo.
Altri suggerimenti
sono le risposte a Come vi tradurre questo da Perl a Python? sufficiente? Non al 100% quello che stai chiedendo, ma quasi ...
A, più a lungo, ma forse la soluzione più leggibile e flessibile diversa:
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
È possibile convertire la stringa in un numero in cui ogni lettera rappresenta una cifra in base 26, aumentare il numero di uno e convertire il numero di nuovo nella stringa. In questo modo si può fare la matematica arbitrario su valori rappresentati come stringhe di lettere.
Il '' minLen '' parametro controlla quante cifre il risultato avranno (dal 0 == un AAAAA ==).
Sucks che Python non ha quello rubino ha: String#next
Quindi, ecco una soluzione di merda a che fare con le stringhe alfanumerici:
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
Non è fantastico. funziona Kinda per me.