我需要生成字符串中所有字符的所有可能排列(重复)。如果字符串为“ abc”,则输出应为:
aaa aab aac abc ... cbc cca ccb ccc
我不能使用itertools模块,也不想使用递归(因为这只是一个例子。我真正需要的是输出数百万个排列,而且我担心内存不足)
我可以这样:
s = 'abc'
for c1 in range(0, 3):
for c2 in range(0, 3):
for c3 in range(0, 3):
print(s[c1]+s[c2]+s[c3])
基本上,我的循环数与字符串中的字符数一样多。现在,假设字符串的长度为10,例如!
有更好的方法吗?
解决此问题的一种简单方法是将字符串中的字符视为不寻常数字系统中的数字。字符串的长度是基数。因此,(重复)的排列'abc'
对应于0
以3**3-1
3'a'
为底的数字0
,从到,其中digit ,'b'
is1
和'c'
is 2
。
def permutations_with_repetition(s):
base = len(s)
for n in range(base**base):
yield "".join(s[n // base**(base-d-1) % base] for d in range(base))
样品运行:
>>> for p in permutations_with_repetition("abc"):
print(p)
aaa
aab
aac
aba
abb
abc
aca
acb
acc
baa
bab
bac
bba
bbb
bbc
bca
bcb
bcc
caa
cab
cac
cba
cbb
cbc
cca
ccb
ccc
如果允许使用itertools
,则需要itertools.product
一个repeat
关键字参数:itertools.product("abc", repeat=3)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句