并非所有 ascii_lowercase 组合都已生成

Not all ascii_lowercase combinations are generated

我正在尝试生成所有可能的长度组合,从 1 到 3 的所有小写字母,即从 "a" - "zzz"

为此,我创建了一个从 0 到 26 ** 3 的循环,并使用 str_base 函数转换为基数 26。

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"开头的组合。

有人可以帮助我吗?

要将 a 打印到 zzzmax 值必须为 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) 将 return b 而不是 a。这样你的结果就差一个位置。所以,您想将其更改为 str_base(d-1, base)

您只在当前字母 if d > 0 的左侧附加更多字母,但随后您直接使用 d 的值对 base 进行索引。 'a' 的索引是 0,因此你永远不会在最左边的位置打印 'a'。您可以通过将 d - 1 传递给 str_base.

的递归调用来纠正此问题

然而,还有另一个问题:由于您似乎将字母视为数字,因此您的基数

  • 要么比你想象的多一位,即相当于0的空串,只出现在这些序列的最左边;
  • 你的零数字实际上是 a,在这种情况下,应该完全预期 a 除了在第一行——毕竟,它相当于零,我们通常省略左边的零。 (也就是说,您的第一个序列是 aaa,第二个序列是 aab 等等,您只是省略了 as)

事实证明,无论哪种方式,这都意味着您要打印的实际序列数量是 26**3 + 26**2 + 26,因为有 26**3 个包含三个字母的序列,26**2 个包含两个字母的序列字母和 26 个包含一个字母的序列。