并非所有 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
打印到 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)
将 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
等等,您只是省略了 a
s)
事实证明,无论哪种方式,这都意味着您要打印的实际序列数量是 26**3 + 26**2 + 26
,因为有 26**3
个包含三个字母的序列,26**2
个包含两个字母的序列字母和 26
个包含一个字母的序列。
我正在尝试生成所有可能的长度组合,从 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
打印到 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)
将 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
等等,您只是省略了a
s)
事实证明,无论哪种方式,这都意味着您要打印的实际序列数量是 26**3 + 26**2 + 26
,因为有 26**3
个包含三个字母的序列,26**2
个包含两个字母的序列字母和 26
个包含一个字母的序列。