Ami*_*mir 5 c++ python product permutation python-itertools
我知道通过使用itertools,我们可以生成products,permutations和combinations.但是,考虑如下情况:
max_allowed_len(sequence)= 3
iterable= ABC
repeat= 3 (or just `range(len('ABC')`)
Run Code Online (Sandbox Code Playgroud)
我有兴趣len(sequence)=0 len(sequence)=1 OR len(sequence)=2 and len(sequence)=3通过重复r 来生成所有不同的可迭代ABC集.它有点奇怪的排列,重复允许不同的序列.所以我的空间是:
3^0 + 3^1 + 3^2 + 3^3= 1 + 3 + 9+ 27= 40
任何人都可以建议我如何在python甚至c/c ++中实现它?
''0'(没有(序列长度为0))
序列长度= 1
'A'
'B'
'C'
Run Code Online (Sandbox Code Playgroud)
序列长度= 2
'AA'
'BB'
'CC'
'AB'
'AC',...
Run Code Online (Sandbox Code Playgroud)
序列长度= 3
'AAB'
'ABA'
'AAC'
'ACA'`
Run Code Online (Sandbox Code Playgroud)
这继续下去.所以这里的长度为0,1,2和3(最大值).
这是为字符串输入构造这样一个迭代器的(相对)简单方法.它''为空序列输出一个空字符串.我调用它两次使输出更容易阅读.
功能的核心是使用生成表达式循环product用repeatARG以产生用于每个组的从零长度的产品到输入字符串的长度迭代器.然后,这些迭代器被方法使用chain.from_iterable并提供给''.join方法,imap用于实际调用由每个元组生成的方法product.
from itertools import product, chain, imap
def all_prod(s):
return imap(''.join, chain.from_iterable(product(s, repeat=i) for i in range(len(s)+1)))
print(list(all_prod('ABC')))
for s in all_prod('abc'):
print(s)
Run Code Online (Sandbox Code Playgroud)
产量
['', 'A', 'B', 'C', 'AA', 'AB', 'AC', 'BA', 'BB', 'BC', 'CA', 'CB', 'CC', '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']
a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
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
Run Code Online (Sandbox Code Playgroud)
FWIW,这是使用普通chain功能的替代版本; 它使用额外的循环代替imap,因此可能效率较低,但我想它也可能更容易理解.
def all_prod(s):
return (''.join(v) for u in chain(product(s, repeat=i) for i in range(len(s)+1)) for v in u)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
321 次 |
| 最近记录: |