例如,给定字母='abcd',我如何在Python中获得此输出:
a
aa
b
bb
ab
ba
(...)
迭代迭代。
我已经尝试过在stackoverflow上找到的powerset()函数, 但这不会在同一字符串中重复字母。
此外,如果我想设置字符串可以具有的最小和最大限制,怎么办?
例如min = 3和max = 4,abc, aaa, aba, ..., aaaa, abca, abcb, ...
答案 0 :(得分:2)
您可以从itertools(docs)中使用combinations_with_replacement
。函数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']
答案 1 :(得分:1)
您可以使用product function of itertools并使用不同的长度。结果与您给出的示例顺序不同,但这可能正是您想要的。这将生成一个生成器,您可以使用该生成器获取所有所需的字符串。此代码使您可以设置返回字符串的最小和最大长度。如果未为参数maxlen
指定值,则生成器是无限的。确保有办法阻止它,否则将陷入无限循环。
import itertools
def allcombinations(alphabet, minlen=1, maxlen=None):
thislen = minlen
while maxlen is None or thislen <= maxlen:
for prod in itertools.product(alphabet, repeat=thislen):
yield ''.join(prod)
thislen += 1
for c in allcombinations('abcd', minlen=1, maxlen=2):
print(c)
此示例给出的打印输出与第一个示例相似,但顺序不同。
a
b
c
d
aa
ab
ac
ad
ba
bb
bc
bd
ca
cb
cc
cd
da
db
dc
dd
如果您真的想要完整的列表,请使用
list(allcombinations('abcd', minlen=1, maxlen=2))