2017-06-06 3 views
1

Ich habe drei Generatoren. Jeder einzelne liefert Ergebnisse/Ereignisse in chronologischer Reihenfolge.
Was ich möchte, ist herauszufinden, welcher der drei Generatoren das nächste (chronologische) Ereignis hat. Eine Möglichkeit, die ich habe, ist eine Liste von einem Ereignis von jedem Generator zu haben, und von welchem ​​Generator es kam. Sortieren Sie dann die Liste, nehmen Sie das erste Ereignis und fügen Sie das nächste Ereignis aus dem entsprechenden Generator meiner Liste hinzu.
Gibt es einen besseren/effizienteren/standardmäßigen Umgang mit diesem Problem?Erhalten Sie das erste Ereignis von mehr als einem Generator

+0

Können Sie bitte ein Beispiel machen? – Netwave

Antwort

1

Da Sie kein konkretes Beispiel gegeben haben, kann ich nur einige Ideen/Pseudocode für Sie bereitstellen. Die Idee besteht darin, höchstens n Elemente von n Iteratoren im Speicher zu halten, da jeder Iterator chronologisch sortierte Objekte liefert. Auch das Einfügen in/aus einer PriorityQueue wird schneller sein als das Sortieren einer Liste immer wieder.

from Queue import PriorityQueue 

def yield_chronologically(iterators): 
    'iterators: list of iterator objects' 
    PQ = PriorityQueue() 

    # put first n items 
    for i, it in enumerate(iterators): 
     try: 
      nxt = next(it)    
      # this is where you have to determine the priority 
      # with a function get_chronological_key you have yet to write 
      chronological_key = get_chronological_key(nxt) 
      PQ.put(chronological_key, (i, nxt)) 
     except StopIteration: 
      pass 

    # yield items and insert next item from iterator that was taken from 
    # into the PQ 
    while not PQ.empty(): 
     _, (i, nxt) = PQ.get() 
     yield nxt 
     try: 
      nxt = next(iterators[i])     
      chronological_key = get_chronological_key(nxt) 
      PQ.put(chronological_key, (i, nxt)) 
     except StopIteration: 
      pass 
+1

Danke. Ich dachte, dass es einen "normalen" Weg geben müsste, damit umzugehen. –

+0

@GreeTreePython kein Problem. Um die Funktion allgemeiner zu machen, könnte man sie so definieren, dass sie ein zweites Argument "Schlüsselfunktion" nimmt, welches die Funktion ist, die auf die von den Iteratoren gelieferten Objekte angewendet wird, um den Einfügepunkt der Prioritätswarteschlange zu bestimmen. I.e. 'Schlüssel = Schlüsselfunktion (nxt)'. – timgeb

Verwandte Themen