Wie kann ich die nächste Zeichenfolge, in alphanumerischer Reihenfolge, in Python?

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

  •  06-09-2019
  •  | 
  •  

Frage

Ich brauche ein einfaches Programm, das einen String gegeben, ich gibt die nächsten in der alphanumerischen Reihenfolge (oder nur die alphabetische Reihenfolge).

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

Und so weiter.

Gibt es eine Funktion für diese in einem der Module bereits?

War es hilfreich?

Lösung

Ich glaube nicht, gibt es eine eingebaute Funktion, dies zu tun. Folgendes sollte funktionieren:

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)

Erläuterung: Sie das letzte Zeichen finden, die kein z ist, es erhöht, und ersetzen Sie alle Zeichen, nachdem es mit a Jahren. Wenn der gesamte String z der ist, dann wieder eine Zeichenfolge aller a ist das eine länger ist.

Andere Tipps

Sind die Antworten auf Wie würden Sie diese übersetzen von Perl Python? ausreichend? Nicht 100%, was Sie fragen, aber in der Nähe ...

Eine andere, länger, aber vielleicht besser lesbar und flexible Lösung:

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

Sie die Zeichenfolge in eine Zahl umwandeln, wo jeder Buchstabe eine Ziffer in der Basis 26 darstellt, erhöhen Sie die Zahl um eins und die Nummer zurück in die Zeichenfolge konvertieren. Auf diese Weise können als Strings von Buchstaben dargestellt auf Werte willkürlich Mathematik tun.

Die '' MinLen '' Parameter steuern, wie viele Stellen das Ergebnis wird (da 0 == a == aaaaa).

Sucks, dass Python hat nicht, was Rubin hat: String#next Also hier ist eine beschissene Lösung mit alphanumerischen Zeichenfolge zu behandeln:

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

Nicht groß. arbeitet Kinda für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top