Python 并非所有ascii_小写组合都会生成

Python 并非所有ascii_小写组合都会生成,python,string,int,base,variations,Python,String,Int,Base,Variations,我试图生成所有可能的长度组合,从1到3的所有小写字母,即从“a”-“zzz” 为此,我创建了一个从0到26**3的循环,并使用str_base函数转换到base 26 def str_base(数字,基数): (d,m)=divmod(数字,len(基数)) 如果d>0: 返回str_base(d,base)+base[m] 返回基数[m] 最大值=(26)**3 对于范围内的i(0,最大值): value=str_base(i,string.ascii_小写) 打印(值) 问题是有些组合没有

我试图生成所有可能的长度组合,从1到3的所有小写字母,即从“a”-“zzz”

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

def str_base(数字,基数):
(d,m)=divmod(数字,len(基数))
如果d>0:
返回str_base(d,base)+base[m]
返回基数[m]
最大值=(26)**3
对于范围内的i(0,最大值):
value=str_base(i,string.ascii_小写)
打印(值)
问题是有些组合没有生成。我得到输出:

.
x
y
z
ba
bb
bc
.
.
不生成以“a”开头的组合


有人能帮我吗?

要将
a
打印到
zzz
最大值必须是26(对于a-z)+26*26(对于aa zz)+26*26*26(aaa zzz)。因此,
max
将是
26+26**2+26**3


另一个问题是
str_base()
。如果
d
变为1(适用于任何值>0),调用
stru base(d,base)
将返回
b
not
a
。这样,您的结果将偏离一个位置。因此,您希望将其改为
stru base(d-1,base)

如果d>0,则只在当前的
左侧追加更多的字母,然后直接使用
d
的值索引
base
'a'
的索引是
0
,因此您永远不会在最左边的位置打印
'a'
。您可以通过将
d-1
传递给
stru base
的递归调用来纠正这个问题

然而,还有另一个问题:因为你似乎把字母当作数字来处理,所以你的基数

  • 要么比你想象的多了一个数字,即等于零的空字符串,它只出现在这些序列中最左边的位置
  • 或者您的零位实际上是
    a
    ,在这种情况下,除了第一行之外,
    a
    永远不会出现在左边-毕竟,它等于零,我们通常省略左边的零。(也就是说,您的第一个序列是
    aaa
    ,第二个序列是
    aab
    ,依此类推,您只是省略了
    a
    s)

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

返回stru base(d,base)+base[m]
这一行就是问题所在。当在
divmod()
之后说
d
是1,
m
是0时,您正在调用
stru base(1,base)
,它将返回
base[1]
b
a
被跳过,而且
max
值是另一个问题。如果您希望a-z后跟aa zz后跟aaa zzz,那么总计数将为(26+26*26+26*26*26)