如何附加到itertools生成器

时间:2018-02-08 18:59:19

标签: python itertools

是否有一种简单的方法可以将一个整数附加到itertools迭代器中的每个项目?如果我使用itertools.product,我不会收到预期的输出。例如:

>>> for i in itertools.product(itertools.combinations(np.arange(4),2),(4,)): 
...   print(i) 
...    
((0, 1), 4)
((0, 2), 4)
((0, 3), 4)
((1, 2), 4)
((1, 3), 4)
((2, 3), 4)

但我希望(我想要的)是

>>> for i in itertools.product(itertools.combinations(np.arange(4),2),(4,)): 
...   print(i) 
...    
(0, 1, 4)
(0, 2, 4)
(0, 3, 4)
(1, 2, 4)
(1, 3, 4)
(2, 3, 4)

我知道我可以"压扁"输出,但我宁愿构造迭代器来生成元组,而不是元组的元组。

我有很多不同的迭代器,我想保持代码对于product的itertool迭代器和普通的itertool迭代器保持相同

1 个答案:

答案 0 :(得分:1)

这两个备选方案各自生成一个迭代器。在第一种情况下,迭代器由generator expression创建。在第二个中,迭代器是使用generator function创建的。

In [9]: for i in (tup + (4,) for tup in itertools.combinations(np.arange(4),2)):
   ...:     print(i)
   ...:     
(0, 1, 4)
(0, 2, 4)
(0, 3, 4)
(1, 2, 4)
(1, 3, 4)
(2, 3, 4)

In [10]: 

生成器函数在调用站点可能更具可读性,尤其是在函数名称描述其行为的情况下。

import itertools
import numpy as np

def adder(it, addend):
    for x in it:
        yield x + addend

for i in adder(itertools.combinations(np.arange(4),2), (4,)):
    print(i)