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
Antwort
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
Danke. Ich dachte, dass es einen "normalen" Weg geben müsste, damit umzugehen. –
@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
- 1. Erhalten Sie eine feste Anzahl von Elementen von einem Generator
- 2. So erhalten Sie das erste Übereinstimmungswort vor einem Treffer
- 3. Wie verwenden Sie das Paint-Ereignis mehr als einmal in einem Formular?
- 4. So erhalten Sie mehr als 100 Aufgaben
- 5. C# Microsoft.Office.Interop.Word Ersetzen durch Selection.Find.Execute() mehr als das erste Wort
- 6. Das erste Wort von jeder Zeile erhalten?
- 7. Erhalten Sie mehr als einen Wert von memcache Ruby
- 8. ucwa erhalten mehr als 100 Suchergebnis
- 9. WebBrowser DocumentCompleted Ereignis ausgelöst mehr als einmal
- 10. Löschen Sie IDs, die mehr als einmal wiederholen, aber das erste Vorkommen
- 11. Wie kann ich das erste Element in einem NSDictionary erhalten?
- 12. Wie erhalten Sie mehr als Standard 10 Ergebnisse von Wikipedia API?
- 13. Aufruf Aufgabe mehr als einmal in Rails 3 Generator
- 14. Ereignis mehrere Rechner/Generator? - MatLab
- 15. Wählen Sie das erste Geschwister
- 16. Erhalten Sie mehr als 1000 Datensätze in Toad Data Point
- 17. Streifen Sie das letzte und erste Zeichen von einem String
- 18. Das erste Element von ArrayList zu bekommen dauert länger als das Erhalten anderer Elemente
- 19. Mehr als 100 Suchergebnisse mit PRAW erhalten?
- 20. Backbone.Collection erhalten erste n als neue Kollektion
- 21. Erhalten Sie mehr Debug-Informationen von AxHost?
- 22. Erhalten Sie immer 20 noch mehr als 20 hochgeladene Dateien?
- 23. Programmgesteuertes Überprüfen von Dateien in TFS mehr als erwartet erhalten
- 24. Streaming von mehr als einem Video gleichzeitig
- 25. Auswählen von mehr als einem Wert
- 26. Vlookup mit mehr als einem gleichen Wert
- 27. Android Volley-Antwort mehr als einmal erhalten
- 28. Werden mehrere Aufgaben warten mehr als die erste Ausnahme beachten?
- 29. Erhalten Sie das lokale Datumsformat als Zeichenfolge
- 30. Ersetzen Sie die erste Zeile von PHP-Skripten, wenn mehr als 250 Zeichen
Können Sie bitte ein Beispiel machen? – Netwave