Python 并非所有ascii_小写组合都会生成
我试图生成所有可能的长度组合,从1到3的所有小写字母,即从“a”-“zzz” 为此,我创建了一个从0到26**3的循环,并使用str_base函数转换到base 26Python 并非所有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_小写) 打印(值) 问题是有些组合没有
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
nota
。这样,您的结果将偏离一个位置。因此,您希望将其改为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)