我有一个小片段,不能以莫名其妙的方式工作 目的是生成两个或更多序列的所有组合 它在使用列表调用时有效,但在使用生成器调用时不起作用。
def comb(seqs):
if seqs:
for item in seqs[0]:
for rest in comb(seqs[1:]):
yield [item] + rest
else:
yield []
if __name__=="__main__":
x=[1,2]
y=[3,4]
print list(comb([x,y])) # prints [[1, 3], [1, 4], [2, 3], [2, 4]]
def gen1(): yield 1; yield 2
def gen2(): yield 3; yield 4
x=gen1()
y=gen2()
print list(comb([x,y])) # prints [[1, 3], [1, 4] WHY ????
答案 0 :(得分:7)
一旦生成器生成了它生成的所有内容,生成器就会耗尽,而列表可以多次迭代。
您的comb
生成器依赖于能够遍历第二个及以后的序列,它会多次传递,因此如果这些序列实际上是一个生成器,则无效。
答案 1 :(得分:2)
原因是您只能迭代生成器一次。在行
for item in seqs[0]
当你到达gen1
的第二个元素时,你进行递归调用以迭代gen2
的元素。问题是你已经在之前的递归调用中迭代了gen2
,所以它不会产生任何项目。
答案 2 :(得分:2)
修正:
def comb(seqs):
if seqs:
inner = list(comb(seqs[1:]))
for item in seqs[0]:
for rest in inner:
yield [item] + rest
else:
yield []
答案 3 :(得分:0)
看看docs.python.org中的itertools,你可能会找到创建迭代器以实现高效循环所需的一切