Come posso ottenere la stringa seguente, in ordine alfanumerico, in Python?

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

  •  06-09-2019
  •  | 
  •  

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à?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top