2016-11-18 52 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