使用python itertools生成自定义迭代

2024-05-17 12:40:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道通过使用itertools,我们可以生成productspermutations和{}。但是,考虑到以下情况:

max_allowed_len(sequence)= 3 
iterable= ABC
repeat= 3 (or just `range(len('ABC')`)

我感兴趣的是通过重复r来生成具有len(sequence)=0 len(sequence)=1 OR len(sequence)=2 and len(sequence)=3的ABC的所有不同的iterable集合。这有点像是一种奇怪的排列,重复允许不同的序列。所以我的空间是: 3^0 + 3^1 + 3^2 + 3^3= 1 + 3 + 9+ 27= 40 有人能建议我如何用python甚至c/c++实现它吗?

e、 g:预期产量:

“0”(无(序列长度0))

长度为1的序列

^{pr2}$

长度为2的序列

'AA'
'BB'
'CC'
'AB'
'AC',...

长度为3的序列

'AAB'
'ABA'
'AAC'
'ACA'` 

这样下去。所以这里的长度是0,1,2和3(最大值)。


Tags: orlen情况range序列iterablemaxproducts
1条回答
网友
1楼 · 发布于 2024-05-17 12:40:59

这里有一个(相对)简单的方法来为字符串输入构造这样的迭代器。它为空序列输出一个空字符串''。我调用它两次以使输出更易于阅读。在

该函数的核心是一个生成器表达式循环,它使用productrepeat参数为从零到输入字符串长度的每组乘积生成迭代器。这些迭代器随后被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)

输出

^{pr2}$

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)

相关问题 更多 >