首页 > 解决方案 > 如何获取python中字母的所有可能字符串?

问题描述

例如,给定字母 = 'abcd',我如何在 Python 中获得此输出:

a
aa
b
bb
ab
ba
(...)

逐次迭代。

我已经尝试过在 stackoverflow 上找到的 powerset() 函数,但它不会在同一个字符串中重复字母。

另外,如果我想设置字符串可以具有的最小和最大限制,我该怎么做?

例如 min=3 和 max=4, abc, aaa, aba, ..., aaaa, abca, abcb, ...

标签: python

解决方案


您可以使用combinations_with_replacementitertools ( docs )。该函数combinations_with_replacement将一个可迭代对象作为其第一个参数(例如您的字母表)以及要生成的组合的所需长度。由于您需要不同长度的字符串,因此您可以遍历每个所需长度。

例如:

from itertools import combinations_with_replacement

def get_all_poss_strings(alphabet, min_length, max_length):
    poss_strings = []

    for r in range(min_length, max_length + 1):
        poss_strings += combinations_with_replacement(alphabet, r)

    return ["".join(s) for s in poss_strings] # combinations_with_replacement returns tuples, so join them into individual strings

样本:

alphabet = "abcd"
min_length = 3
max_length = 4
get_all_poss_strings(alphabet, min_length, max_length)

输出:

['aaa', 'aab', 'aac', 'aad', 'abb', 'abc', 'abd', 'acc', 'acd', 'add', 'bbb', 'bbc', 'bbd', 'bcc', 'bcd', 'bdd', 'ccc', 'ccd', 'cdd', 'ddd', 'aaaa', 'aaab', 'aaac', 'aaad', 'aabb', 'aabc', 'aabd', 'aacc', 'aacd', 'aadd', 'abbb', 'abbc', 'abbd', 'abcc', 'abcd', 'abdd', 'accc', 'accd', 'acdd', 'addd', 'bbbb', 'bbbc', 'bbbd', 'bbcc', 'bbcd', 'bbdd', 'bccc', 'bccd', 'bcdd', 'bddd', 'cccc', 'cccd', 'ccdd', 'cddd', 'dddd']

编辑:

如果顺序对您的字符串也很重要(如具有"ab"和所示"ba"),您可以使用以下函数获取给定范围内所有长度的所有排列:

from itertools import combinations_with_replacement, permutations

def get_all_poss_strings(alphabet, min_length, max_length):
    poss_strings = []
    for r in range(min_length, max_length + 1):
        combos = combinations_with_replacement(alphabet, r)
        perms_of_combos = []
        for combo in combos:
            perms_of_combos += permutations(combo)
        poss_strings += perms_of_combos

    return list(set(["".join(s) for s in poss_strings]))

样本:

alphabet = "abcd"
min_length = 1
max_length = 2
get_all_poss_strings(alphabet, min_length, max_length)

输出:

['a', 'aa', 'ab', 'ac', 'ad', 'b', 'ba', 'bb', 'bc', 'bd', 'c', 'ca', 'cb', 'cc', 'cd', 'd', 'da', 'db', 'dc', 'dd']

推荐阅读