python - Python 中可变数量的可预测 for 循环

标签 python python-3.x nested-loops

我正在尝试想出一种方法,从 20 个字符的字母表中生成所有可能的唯一字符串,其中字符串内的顺序无关紧要,并且字符串的长度可以变化。因此,例如,对于长度为 3 的字符串,可能的字符串将是 AAAAABAAC 等,但不会包括 BAACAA。我找到了一种使用 itertools.product() 的方法,但它的计算成本非常高。最简单的方法就是使用嵌套的 for 循环。例如,要生成所有长度为四的字符串:

alphabet = ["A","C","D","E","F","G","H","I","K","L",
            "M","N","P","Q","R","S","T","V","W","Y"]
combos = []
for a in range(len(alphabet)):
    for b in range(a,len(alphabet)):
        for c in range(b,len(alphabet)):
            for d in range(c,len(alphabet)):
                combos.append(alphabet[a] + alphabet[b] + alphabet[c] + alphabet[d])

现在,通过更改 for 循环的数量,可以轻松地为任何长度的字符串完成此操作。考虑到 for 循环序列本身是非常可预测的,是否有办法简化此代码,而不是让 if length == 3 运行三个 for 循环和 if length == 4改为运行四个循环?我现在能想到的唯一方法是一堆 if-elif 语句:

if length == 3:
    for a in range(len(alphabet)):
        for b in range(a,len(alphabet)):
            for c in range(b,len(alphabet)):
                combos.append(alphabet[a] + alphabet[b] + alphabet[c])
elif length == 4:
    for a in range(len(alphabet)):
        for b in range(a,len(alphabet)):
            for c in range(b,len(alphabet)):
                for d in range(c,len(alphabet)):
                    combos.append(alphabet[a] + alphabet[b] + alphabet[c] + alphabet[d])

除了覆盖一堆可能的长度值之外,还有什么更简单的方法吗?

最佳答案

IIUC,您可以简单地使用 itertools.combinations_with_replacement

>>> list(map(''.join, combinations_with_replacement(["a","b","c"],2)))
['aa', 'ab', 'ac', 'bb', 'bc', 'cc']
>>> list(map(''.join, combinations_with_replacement(["a","b","c"],3)))
['aaa', 'aab', 'aac', 'abb', 'abc', 'acc', 'bbb', 'bbc', 'bcc', 'ccc']
>>> list(map(''.join, combinations_with_replacement(alphabet,4))) == orig(alphabet)
True

(其中 orig 只是包装到函数中的原始代码)。

关于python - Python 中可变数量的可预测 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32059848/

相关文章:

python - 如何拆分内部有空格的合并列

python - Django + MySQL,形成/创建 mysql 查询以将有效参数传递给 url

python-3.x - PyGame,等待计算机决定它的 Action

python - PyQt4 和 Python 3 - 显示来自 URL 的图像

python - 在 Python 中导入嵌套模块

python - python 中如何检查输入是否为整数?

python - 如何将日期时间格式转换为分钟 - pandas

c - 嵌套循环 C 编程 - 我需要扫描输入以查找字母集

php - 有没有更有效的方法来编写嵌套的 While 循环?

java - 您如何编写使用StdAudio在Java中弹奏和弦的方法?