[我正在尝试生成所有小写形式的从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)
将返回b
而不是a
。因此,您想将其更改为str_base(d-1, base)
。
您仅在当前一个if d > 0
的左侧追加其他字母,但随后您将base
的值直接索引为d
。 'a'
的索引为0
,因此您永远不会在最左边的位置打印'a'
。您可以通过将d - 1
传递给str_base
的递归调用来纠正此问题。
但是,还有另一个问题:您的库中实际上比您想象的多了一个数字,即空字符串。您仅在最左边的位置包含空字符串,而忽略所有其他字符串,事实证明这意味着您要打印的序列的实际数量为26**3 + 26**2 + 26
。
您可以使用Permutation and Combination in Python使用另一种方法
from itertools import combinations
import string
def get_combinations(n):
alphabet=list(string.ascii_lowercase)
allCombination=[]
for i in range(1,n+1):
allCombination.extend(combinations(alphabet, i))
return allCombination
result= get_combinations(2)
for i in result:
print (''.join(i))