2010-05-14 14 views
5

¿cuál es una manera simple de aumentar la longitud de una cadena a un entero arbitrario x? como 'a' va a 'z' y luego va a 'aa' a 'zz' a 'aaa', etc.aumentando el tamaño de cadena a través del bucle

+0

dónde viene 'x' entrar? Al igual que si la cadena es "abc" y "x" es 4, la cadena se convierte en "abg"? –

+0

oops. quise decir que la cuerda se vuelve x larga, entonces si x = 4, las cuerdas serían 'aaaa' ... 'zzzz' – calccrypto

+0

Algo relacionado, ver [este código de golf] (http://stackoverflow.com/questions/ 2634427/code-golf-numeric-equivalent-of-an-excel-column-name /). –

Respuesta

6

Que debe hacer el truco:

def iterate_strings(n): 
    if n <= 0: 
     yield '' 
     return 
    for c in string.ascii_lowercase: 
     for s in iterate_strings(n - 1): 
      yield c + s 

Devuelve un generador. Se puede recorrer con un bucle for:

for s in iterate_strings(5) 

O obtener una lista de las cuerdas:

list(iterate_strings(5)) 

Si desea iterar sobre cadenas más cortas demasiado, puede utilizar esta función:

def iterate_strings(n): 
    yield '' 
    if n <= 0: 
     return 
    for c in string.ascii_lowercase: 
     for s in iterate_strings(n - 1): 
      yield c + s 
+0

aunque va hacia atrás, ¡genial! – calccrypto

+0

Se corrigió el problema de retroceso. Vote por mi respuesta :) :) – Adam

+0

intenté, pero aparentemente necesito 15 reputación – calccrypto

0

Puede multiplicar la cadena en el entero. Por ejemplo

>>> 'a' * 2 
'aa' 
>>> 'a' * 4 
'aaaa' 
>>> 'z' * 3 
'zzz' 
>>> 'az' * 3 
'azazaz' 
+0

sí, pero quiero ejecutar todas las permutaciones – calccrypto

+0

Veamos si lo entiendo bien: desea iterar sobre todas las cadenas entre 'aaaa' y 'zzzz', ('aaaa', 'aaab', 'aaac' , .... 'zzzz'). – Adam

+0

correcto. hasta el final de la cadena x caracteres largos – calccrypto

0

Define x. Estoy usando x = 5 para este ejemplo.

x = 5 
import string 
for n in range(1,x+1): 
    for letter in string.ascii_lowercase: 
    print letter*n 
+0

Es posible que desee establecer el valor inicial de la declaración de rango ya que lo primero que se imprime con ese código son 26 líneas de espacios en blanco porque al principio está haciendo 'letter * 0'. – Dustin

+0

Muy cierto. Fijo. – tdedecko

2

Aquí está mi solución, similar a la de Adam, excepto que no es recursiva. :].

from itertools import product 
from string import lowercase 

def letter_generator(limit): 
    for length in range(1, limit+1): 
     for letters in product(lowercase, repeat=length): 
      yield ''.join(letters) 

Y devuelve un generator, por lo que puede utilizar un bucle for para iterar sobre ella:

for letters in letter_generator(5): 
    # ... 

Que se diviertan!

(Esta es la segunda vez hoy he encontrado itertools.product() útil. Woot.)

Cuestiones relacionadas