¿Cómo puedo obtener la siguiente cadena, en orden alfanumérico, en Python?

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

  •  06-09-2019
  •  | 
  •  

Pregunta

Necesito un programa simple que da una cadena, vuelve a mí el siguiente en el orden alfanumérico (o simplemente el orden alfabético).

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

Y así sucesivamente.

¿Hay una función para esto en uno de los módulos ya?

¿Fue útil?

Solución

No creo que hay una función integrada para realizar esta acción. El siguiente debería funcionar:

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)

Explicación: a encontrar el último carácter que no es un z, se incrementará, y sustituir todos los caracteres después de la a. Si toda la cadena es de z, a continuación, devolver una cadena de todos los de a que es uno más largo.

Otros consejos

¿Son las respuestas en ¿Cómo traducir esto de Perl a Python? suficiente? No es 100% lo que estás pidiendo, pero cerca ...

A más largo, solución diferente, pero tal vez más legible y 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

convertir la cadena en un número, donde cada letra representa un dígito en base 26, aumentar el número en uno y convertir el número de nuevo en la cadena. De esta manera usted puede hacer matemáticas arbitrario en valores representados como cadenas de letras.

El '' '' minlen controles de parámetros cuántos dígitos el resultado tendrán (desde 0 == un aaaaa ==).

Chupa que Python no tiene lo que tiene rubí: String#next Así que he aquí una solución de mierda para hacer frente a las cadenas alfa-numérica:

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

No es muy bueno. Un poco funciona para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top