Python笛卡尔功率发生器在功率列表上
如何创建一个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:
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