【问题标题】:Not all ascii_lowercase combinations are generated并非所有 ascii_lowercase 组合都生成
【发布时间】:2019-10-31 10:48:35
【问题描述】:

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

为此,我创建了一个从 0 到 26 ** 3 的循环,并使用 str_base 函数转换为 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”开头的组合。

有人可以帮帮我吗?

【问题讨论】:

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

标签: python string int base variations


【解决方案1】:

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

但是,还有另一个问题:由于您似乎将字母视为数字,因此您的基数

  • 其中一个比你想象的多一个数字,即相当于零的空字符串,它只出现在这些序列的最左边;
  • 您的零位实际上是a,在这种情况下,应该完全预期a 不会出现在除第一行之外的左侧 - 毕竟,它等于零, 我们通常省略左边的零。 (也就是说,你的第一个序列是aaa,第二个是aab 等等,你只是省略了as)

事实证明,无论哪种方式,这意味着您要打印的序列的实际数量是26**3 + 26**2 + 26,因为有三个字母的26**3序列、两个字母的26**2序列和一个一个的26序列写在里面。

【讨论】:

    【解决方案2】:

    要将a 打印到zzzmax 的值必须是 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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      相关资源
      最近更新 更多