并非所有ascii_lowercase组合都生成

问题描述 投票:0回答:2

[我正在尝试生成所有小写形式的从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”开头的组合。

有人可以帮我吗?

python string int base variations
2个回答
0
投票

要打印azzzmax值必须为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)


0
投票

您仅在当前一个if d > 0的左侧追加其他字母,但随后您将base的值直接索引为d'a'的索引为0,因此您永远不会在最左边的位置打印'a'。您可以通过将d - 1传递给str_base的递归调用来纠正此问题。

但是,还有另一个问题:您的库中实际上比您想象的多了一个数字,即空字符串。您仅在最左边的位置包含空字符串,而忽略所有其他字符串,事实证明这意味着您要打印的序列的实际数量为26**3 + 26**2 + 26


0
投票

您可以使用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))
© www.soinside.com 2019 - 2024. All rights reserved.