Не все комбинации ascii_lowercase генерируются - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь сгенерировать все возможные комбинации длины от 1 до 3 из всех строчных букв, то есть от "a" - "zzz"

Для этого я создаю цикл от 0 до 26 ** 3 и преобразуйте в базу 26 с помощью функции str_base.

def str_base(number, base):
   (d,m) = divmod(number,len(base))
   if d > 0:
      return str_base(d,base)+base[m]
   return base[m]

max = (26)**3
for i in range (0,max):
    value = str_base(i,string.ascii_lowercase)
    print(value)

Проблема в том, что есть некоторые комбинации, которые не генерируются. Я получаю вывод:

.
x
y
z
ba
bb
bc
.
.

Комбинации, начинающиеся с "a", не генерируются.

Может ли кто-нибудь мне помочь?

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Вы добавляете только дополнительные буквы слева от текущего if d > 0, но затем непосредственно индексируете base со значением d. Индекс 'a' равен 0, поэтому вы никогда не напечатаете 'a' в крайнем левом положении. Вы можете исправить это, передав вместо d - 1 рекурсивный вызов str_base.

Однако есть еще одна проблема: поскольку вы, похоже, рассматриваете буквы, как если бы они были цифрами, ваша база

  • либо содержит на одну цифру больше, чем вы думаете, а именно пустую строку, эквивалентную нулю, которая встречается только в самой левой позиции в этих последовательностях;
  • или ваша нулевая цифра на самом деле a, и в этом случае следует полностью ожидать, что a никогда не встречается слева, кроме первой строки - в конце концов, это эквивалентно нулю,и мы обычно опускаем нули слева. (То есть ваша первая последовательность aaa, вторая aab и т. Д., Вы просто пропускаете a s)

Оказывается, в любом случае это означает фактическуюколичество последовательностей, которые вы хотите напечатать, составляет 26**3 + 26**2 + 26, потому что есть 26**3 последовательностей с тремя буквами, 26**2 последовательностей с двумя буквами и 26 последовательностей с одной буквой в них.

0 голосов
/ 31 октября 2019

Для печати от a до zzz значение max должно быть 26 (для a - z) + 26 * 26 (для aa-zz) + 26 * 26 * 26 (aaa-zzz). Итак, max будет 26 + 26**2 + 26**3

Также другая проблема в str_base(). Если d становится 1 (применимо для любого значения> 0), вызов str_base(d,base) вернет b, а не a. Таким образом, ваш результат отклоняется на одну позицию. Итак, вы хотите изменить это значение на str_base(d-1, base).

...