2010-05-14 3 views
5

Что такое простой способ увеличить длину строки до произвольного целого x? как 'a' переходит в 'z', а затем переходит к 'aa' в 'zz' в 'aaa' и т. д.Увеличение размера строки через цикл

+0

Где 'x' бывают? Например, если строка «abc» и «x» равна 4, строка становится «abg»? –

+0

oops. я хотел сказать, что строка становится х длинной, поэтому, если x = 4, строки будут «aaaa» ... «zzzz» – calccrypto

+0

В некоторой степени, см. [this code golf] (http://stackoverflow.com/questions/ 2634427/код-гольфы-числовой-эквивалентный из-ан-имени столбца-первенствовать /). –

ответ

6

Это должно сделать трюк:

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 

Он возвращает генератор. Вы можете перебирать его для цикла:

for s in iterate_strings(5) 

Или получить список строк:

list(iterate_strings(5)) 

Если вы хотите перебрать короткие строки тоже, вы можете использовать эту функцию:

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

, хотя он идет назад, круто! – calccrypto

+0

Исправлена ​​проблема с обратным ходом. Голосуйте за мой ответ, пожалуйста :) – Adam

+0

Я пробовал, но, видимо, мне нужно 15 репутации – calccrypto

0

Вы можете умножить строку на целое число. Например,

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

да, но я хочу пробежать все перестановки – calccrypto

+0

Давайте посмотрим, прав ли вы: вы хотите перебирать все строки между 'aaaa' и 'zzzz', ('aaaa', 'aaab', 'aaac' , .... 'zzzz'). – Adam

+0

правильный. до тех пор, пока строка не будет длинна x. – calccrypto

0

Определить x. В этом примере я использую x = 5.

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

Возможно, вы захотите установить начальное значение оператора диапазона, так как первое, что напечатано с использованием этого кода, составляет 26 строк пробелов, потому что вы сначала делаете 'letter * 0'. – Dustin

+0

Очень верно. Исправлена. – tdedecko

2

Вот мое решение, похожее на Адама, за исключением того, что оно не является рекурсивным. :].

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) 

И это возвращает generator, так что вы можете использовать for цикл для перебора над ним:

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

Удачи!

(Это второй раз, когда я сегодня нашел itertools.product() полезным. Woot.)

Смежные вопросы