2016-11-18 1 views
4

Ich habe eine Bibliotheksfunktion (die ich nicht ändern kann), die als Eingabe einen Iterator verwendet, der einen bestimmten Typ von Objekten bereitstellt. Ich habe diese Eingabe als Generator implementiert, der Text analysiert und Teile davon liefert. Ich möchte in der Lage sein, andere während der Textanalyse gefundene Informationen zu berücksichtigen.Wie senden Sie zusätzliche Ergebnisse von einem Python-Generator an eine Verbraucherfunktion?

Die Kommentare im folgenden Beispiel eine Vorstellung davon, was Ich mag zu tun wäre:

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) 

Wie konnte ich zusammen mit dem Ausgang des unmodifiable diese Informationen von meinem Generator meiner Verbraucher Funktion zum Senden gehen Bibliotheksfunktion?

+0

müssen Sie diese double_ints verwenden? Kannst du nicht einfach eine Karte anrufen? – danielfranca

+0

Dies ist nur ein Beispiel. Ich beschäftige mich tatsächlich mit einer bioinformatischen Analyseaufgabe, aber ich zog es vor, ein einfaches Beispiel zu verwenden. – bli

+0

Können Sie die Zeichen in einem anderen Array speichern und dann enumerate verwenden, um den richtigen Index zu erhalten und von my_consumer_function aus darauf zuzugreifen? – danielfranca

Antwort

2

Ich frage mich, was der beste Weg ist, aber hier ist ein Weg:

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) 

Für Python 3 verwenden regelmäßig map und zip.

+0

Ich vermutete, dass etwas mit 'Tee' gemacht werden könnte, aber ich hatte es bis jetzt noch nicht benutzt. Vielen Dank. – bli

Verwandte Themen