2016-11-18 32 views
4

我有一个库函数(我无法更改),它将输入的迭代器作为提供某种类型对象的迭代器。我将此输入实现为一个生成器,用于解析文本并生成部分文本。我希望能够考虑在文本解析期间找到的其他信息。如何从python生成器发送额外的结果到消费者函数?

在下面的示例中的意见给予的,我想做些什么的想法:

the_text = """1:- 
3:- 
2:+ 
4:- 
6:+ 
2:- 
4:- 
5:+ 
6:- 
7:+""" 

def extract_ints(text): 
    for line in text.split("\n"): 
     fields = line.split(":") 
     #<send fields[1] to my_consumer_function> 
     yield fields[0] 

# Cannot modify this one (actually loaded from library) 
def double_ints(num_source): 
    """Only wants numbers.""" 
    for num in num_source: 
     yield 2 * int(num) 

def my_consumer_function(text): 
    for value in double_ints(extract_ints(text)): 
     #<receive sign from extract_ints> 
     #if sign == "-": 
     # value *= -1 
     print(value) 

my_consumer_function(the_text) 

我怎么能继续从我的生成与不可修改的输出一起将该信息发送给我的消费功能库函数?

+0

你需要使用这个double_ints?你不能只是打电话给地图吗? – danielfranca

+0

这只是一个例子。实际上我正在处理一些生物信息学分析任务,但我更愿意使用一个简单的例子。 – bli

+0

您可以将标志存储在不同的数组中,然后使用枚举获取正确的索引并从my_consumer_function访问它? – danielfranca

回答

2

我不知道什么是最好的方式,但这里有一个方法:

from itertools import imap, izip, tee 
from operator import itemgetter 

def extract_ints(text): 
    for line in text.split("\n"): 
     fields = line.split(":") 
     yield fields[0], fields[1] 

def my_consumer_function(text):  
    it1, it2 = tee(extract_ints(text)) 
    it1 = double_ints(imap(itemgetter(0), it1)) 
    it2 = imap(itemgetter(1), it2) 
    for value, sign in izip(it1, it2): 
     if sign == "-": 
      value *= -1 
     print(value) 

对于Python 3使用常规mapzip

+0

我怀疑可以使用'tee'完成某些工作,但到目前为止我还没有使用它。谢谢。 – bli

相关问题