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

は私が最善の方法だのだろうが、ここでは一つの方法です:mapzip通常のPython 3を使用するために

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) 

+0

私は 'tee'を使って何かができると思っていましたが、まだこれまで使っていませんでした。ありがとう。 – bli

関連する問題