Cómo incrementar valores alfanuméricos.

Actualmente estoy trabajando en un progtwig. Me gustaría que incrementara un valor alfanumérico de 5 caracteres. (Lo siento si el incremento no es la palabra correcta).

Así que me gustaría que el progtwig diga que comience en 55aa0 y termine en 99zz9. La razón por la que me gustaría que comenzara en 55aa0 y no en 00aa0 es que, por lo que estoy haciendo, sería una pérdida de tiempo.

También me gustaría asignar ese valor a una variable y agregarlo al final de otra variable y llamar a esta url.

Entonces, por ejemplo, la url podría ser: domain.de/69xh2

Si necesitas más información con gusto la añadiré.

count = 0 while count <= n: url = "" if url.endswith(".jpg"): fileType = ".jpg" elif url.endswith(".png"): fileType = ".png" if os.path.isfile("images/" + fileName): pass else: urllib.urlretrieve(url, "images/" + count + fileType) count = count + 1 

Esto suena como un trabajo para itertools :

 from itertools import dropwhile, islice, product from string import digits, ascii_lowercase as letters def values(): """Yield strings in format '00aa0', starting with '55aa0'.""" def pred(t): """Return False once second digit in tuple t reaches '5'.""" return t[1] < '5' for t in dropwhile(pred, product(digits[5:], digits, letters, letters, digits)): yield "".join(t) 

Esto comienza con (usando la list(islice(values(), 0, 21)) según la sugerencia de Simon):

 ['55aa0', '55aa1', '55aa2', '55aa3', '55aa4', '55aa5', '55aa6', '55aa7', '55aa8', '55aa9', '55ab0', '55ab1', '55ab2', '55ab3', '55ab4', '55ab5', '55ab6', '55ab7', '55ab8', '55ab9', '55ac0'] 

Una ventaja de usar itertools para esto es que no tiene que construir la lista completa (304,200 elementos) en la memoria, pero puede iterar sobre ella:

 for s in values(): # use s 

Tenga en cuenta que esta versión está bastante ajustada a sus requisitos (recomendación de Krab para mejorar la eficiencia), pero podría modificarse fácilmente para un uso más general.

Una versión aún más rápida, de nuevo de la sugerencia de Krab:

 def values(): """Yield strings in format '00aa0', starting with '55aa0'.""" for t in product(map(str, range(55, 100)), letters, letters, digits): yield "".join(t) 

Nota: use xrange e itertools.imap en Python 2.x.

Depende de lo que quieras incrementar primero (es decir, el número al final, la primera letra, la segunda letra o el primer número), pero solo tendría variables separadas y las concatenaré. También sugeriría llamar a sus cartas desde una matriz:

  letters = ["a","b"..."y","z"] var firstNum = 55 var firstLetter = letters[0] var secondLetter = letters[0] var scondNum = 0 

luego haga un bucle que incremente lo que desee y concatene. Por ejemplo, si desea incrementar el último número primero:

 varList = [] for i in range(0, 100): varList.append(firstNum + firstLetter + secondLetter + (secondNum + i)) 

luego insertaría otro bucle dentro de ese bucle que incremente el índice de la segunda letra, etc.

¡Espero que ayude!

Utilicé el algoritmo básico de sumr dos enteros dígito a dígito de derecha a izquierda.

 def get_next(st): next_str = "" increment = '0'*(len(st)-1) + '1' index = len(st) -1 carry = 0 curr_digit = 0 while(index>=0): if (st[index].isalpha()): curr_digit = (ord(st[index]) + int(increment[index]) + carry) if curr_digit > ord('z'): curr_digit -= ord('a') curr_digit %= 26 curr_digit += ord('a') carry = 1 else: carry = 0 curr_digit = chr(curr_digit) next_str += curr_digit elif (st[index].isdigit()): curr_digit = int(st[index]) + int(increment[index]) + carry if curr_digit > 9: curr_digit %= 10 carry = 1 else: carry = 0 next_str += str(curr_digit) index -= 1 return next_str[::-1] counter = 20 next_str = '55aa0' while(counter > 0): next_str = get_next(next_str) print next_str counter -= 1 

Salida:

 55aa1 55aa2 55aa3 55aa4 55aa5 55aa6 55aa7 55aa8 55aa9 55ab0 55ab1 55ab2 55ab3 55ab4 55ab5 55ab6 55ab7 55ab8 55ab9 55ac0