Python笛卡尔功率发生器在功率列表上

Python笛卡尔功率发生器在功率列表上,python,iterator,generator,itertools,cartesian-product,Python,Iterator,Generator,Itertools,Cartesian Product,如何创建一个Python生成器,就像由itertools.product()生成的那样,但它会在重复值列表上进行迭代?它的行为类似于嵌套的for循环: theSet = 'ABC' thePowers = range(4) for i in thePowers: for j in itertools.product(theSet, repeat=i): print j 但我希望它是一个发电机,这样可以产生相同的输出: for p in myGenerator:

如何创建一个Python生成器,就像由
itertools.product()
生成的那样,但它会在重复值列表上进行迭代?它的行为类似于嵌套的
for
循环:

theSet = 'ABC'
thePowers = range(4)

for i in thePowers:
    for j in itertools.product(theSet, repeat=i):
        print j
但我希望它是一个发电机,这样可以产生相同的输出:

for p in myGenerator:
    print p

   # <= that was a null string ie ''
A
B
C
AA
AB
AC
BA
BB
...
CCA
CCB
CCC

#您可以为它定义一个生成器函数

>>> from itertools import product
>>> def my_gen(letters, powers):
...     for power in powers:
...         for cartesian in product(letters, repeat=power):
...             yield cartesian
...         
...     
... 
>>>
然后像这样使用它:

>>> for p in my_gen("ABC", range(4)):
...    print p
()
('A',)
('B',)
('C',)
('A', 'A')
('A', 'B')
('A', 'C')
('B', 'A')
('B', 'B')
('B', 'C')
('C', 'A')
('C', 'B')
('C', 'C')
('A', 'A', 'A')
('A', 'A', 'B')
('A', 'A', 'C')
('A', 'B', 'A')
('A', 'B', 'B')
('A', 'B', 'C')
('A', 'C', 'A')
('A', 'C', 'B')
('A', 'C', 'C')
('B', 'A', 'A')
('B', 'A', 'B')
('B', 'A', 'C')
('B', 'B', 'A')
('B', 'B', 'B')
('B', 'B', 'C')
('B', 'C', 'A')
('B', 'C', 'B')
('B', 'C', 'C')
('C', 'A', 'A')
('C', 'A', 'B')
('C', 'A', 'C')
('C', 'B', 'A')
('C', 'B', 'B')
('C', 'B', 'C')
('C', 'C', 'A')
('C', 'C', 'B')
('C', 'C', 'C')
也可以使用生成器表达式

>>> products = list(product("ABC", repeat=i) for i in range(4))
>>> result = list(x for lst in products for x in lst)
>>> result
[(), ('A',), ('B',), ('C',), ('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B
', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C'), ('A', 'A', 'A'), ('A',
'A', 'B'), ('A', 'A', 'C'), ('A', 'B', 'A'), ('A', 'B', 'B'), ('A', 'B', 'C'), (
'A', 'C', 'A'), ('A', 'C', 'B'), ('A', 'C', 'C'), ('B', 'A', 'A'), ('B', 'A', 'B
'), ('B', 'A', 'C'), ('B', 'B', 'A'), ('B', 'B', 'B'), ('B', 'B', 'C'), ('B', 'C
', 'A'), ('B', 'C', 'B'), ('B', 'C', 'C'), ('C', 'A', 'A'), ('C', 'A', 'B'), ('C
', 'A', 'C'), ('C', 'B', 'A'), ('C', 'B', 'B'), ('C', 'B', 'C'), ('C', 'C', 'A')
, ('C', 'C', 'B'), ('C', 'C', 'C')]

使用“yield”关键字可以很容易地做到这一点。这里有一个我发现很清楚的博客:


最后一条语句向我们保证输出是相同的。我想你会想做一些比用生成的值创建列表更复杂的事情。

这里有足够的信息来做我想做的事情,谢谢!我在msvalkon的回答上做了标记,因为它给出了我略显笼统的问题的具体答案。
>>> products = list(product("ABC", repeat=i) for i in range(4))
>>> result = list(x for lst in products for x in lst)
>>> result
[(), ('A',), ('B',), ('C',), ('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B
', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C'), ('A', 'A', 'A'), ('A',
'A', 'B'), ('A', 'A', 'C'), ('A', 'B', 'A'), ('A', 'B', 'B'), ('A', 'B', 'C'), (
'A', 'C', 'A'), ('A', 'C', 'B'), ('A', 'C', 'C'), ('B', 'A', 'A'), ('B', 'A', 'B
'), ('B', 'A', 'C'), ('B', 'B', 'A'), ('B', 'B', 'B'), ('B', 'B', 'C'), ('B', 'C
', 'A'), ('B', 'C', 'B'), ('B', 'C', 'C'), ('C', 'A', 'A'), ('C', 'A', 'B'), ('C
', 'A', 'C'), ('C', 'B', 'A'), ('C', 'B', 'B'), ('C', 'B', 'C'), ('C', 'C', 'A')
, ('C', 'C', 'B'), ('C', 'C', 'C')]
import itertools

def iterate():
    theSet = 'ABC'
    thePowers = range(4)

    output = []
    for i in thePowers:
        for j in itertools.product(theSet, repeat=i):
            output.append(j)
    return output

def generate():
    theSet = 'ABC'
    thePowers = range(4)

    for i in thePowers:
        for j in itertools.product(theSet, repeat=i):
            yield j

a = iterate()
b = [output for output in generate()]
print(a == b) # True