Ich habe eine Liste von Diktaten, etwa so:
%Vor% Die dict-Elemente sind in der Liste nach den 'offset'
-Daten sortiert. Die realen Daten könnten viel länger sein.
Was ich tun möchte, ist, ein Element in der Liste nach einem bestimmten Offset-Wert zu suchen, der nicht genau einer dieser Werte ist, aber in diesem Bereich. Also, eine binäre Suche ist was ich machen will.
Mir ist jetzt das Python-Modul bisect
bekannt, bei dem es sich um eine fertige binäre Suche handelt. toll, aber nicht direkt nutzbar für diesen Fall. Ich frage mich nur, was ist der einfachste Weg, um bisect
auf meine Bedürfnisse anzupassen. Hier ist, was ich gefunden habe:
Es druckt:
%Vor%Meine Frage ist, ist dies der beste Weg, um zu tun, was ich will, oder gibt es einen anderen einfacheren, besseren Weg?
Das übliche Muster ähnelt dem Sortieren nach einem Attribut, dekorieren, bedienen und nicht verzieren. In diesem Fall müssten Sie nur dekorieren und dann anrufen. Sie möchten dies jedoch vermeiden, da decorate O (n) ist, während Sie möchten, dass O (logn) ist. Daher würde ich Ihre Methode für am besten halten.
Sie können auch eine der vielen SortedDict-Implementierungen von Python verwenden, um Ihre test_data zu verwalten. Ein sortierter Ausdruck sortiert die Elemente nach Schlüssel und pflegt eine Zuordnung zu einem Wert. Einige Implementierungen unterstützen auch eine Halbierung der Schlüssel. Zum Beispiel hat das Python sortedcontainers-Modul eine SortedDict , das Ihren Anforderungen entspricht.
In Ihrem Fall würde es ungefähr so aussehen:
%Vor%Der SortedDict-Typ hat eine Halbierungsfunktion, die den halbierten Index des gewünschten Schlüssels zurückgibt. Mit diesem Index können Sie den tatsächlichen Schlüssel nachschlagen. Und mit diesem Schlüssel können Sie den Wert erhalten.
All diese Operationen sind sehr schnell in sortedcontainers, was auch in pure-Python praktikabel ist. Es gibt auch einen Leistungsvergleich , der andere Auswahlmöglichkeiten diskutiert und Benchmark-Daten enthält.
Sie können auch eine der vielen SortedDict-Implementierungen von Python verwenden, um Ihre test_data zu verwalten. Ein sortierter Ausdruck sortiert die Elemente nach Schlüssel und pflegt eine Zuordnung zu einem Wert. Einige Implementierungen unterstützen auch eine Halbierung der Schlüssel. Zum Beispiel hat das Python sortedcontainers-Modul eine SortedDict , das Ihren Anforderungen entspricht.
In Ihrem Fall würde es ungefähr so aussehen:
%Vor%Der SortedDict-Typ hat eine Halbierungsfunktion, die den halbierten Index des gewünschten Schlüssels zurückgibt. Mit diesem Index können Sie den tatsächlichen Schlüssel nachschlagen. Und mit diesem Schlüssel können Sie den Wert erhalten.
All diese Operationen sind sehr schnell in sortedcontainers, was auch in pure-Python praktikabel ist. Es gibt auch einen Leistungsvergleich , der andere Auswahlmöglichkeiten diskutiert und Benchmark-Daten enthält.
Das übliche Muster ähnelt dem Sortieren nach einem Attribut, dekorieren, bedienen und nicht verzieren. In diesem Fall müssten Sie nur dekorieren und dann anrufen. Sie möchten dies jedoch vermeiden, da decorate O (n) ist, während Sie möchten, dass O (logn) ist. Daher würde ich Ihre Methode für am besten halten.
Was Sie tun können, ist dies
%Vor%Dies sollte Ihnen erlauben, eine einfache %code% of %code% Instanzen zu erstellen. Der Algorithmus %code% sollte vollkommen glücklich sein, die definierten Operatoren zu verwenden.
Sie können Ihre %code% verwenden.
Oder
%Vor%Das sollte die %code% eher wie eine %code% machen.
Ich habe eine Liste von Diktaten, etwa so:
%Vor%Die dict-Elemente sind in der Liste nach den %code% -Daten sortiert. Die realen Daten könnten viel länger sein.
Was ich tun möchte, ist, ein Element in der Liste nach einem bestimmten Offset-Wert zu suchen, der nicht genau einer dieser Werte ist, aber in diesem Bereich. Also, eine binäre Suche ist was ich machen will.
Mir ist jetzt das Python-Modul %code% bekannt, bei dem es sich um eine fertige binäre Suche handelt. toll, aber nicht direkt nutzbar für diesen Fall. Ich frage mich nur, was ist der einfachste Weg, um %code% auf meine Bedürfnisse anzupassen. Hier ist, was ich gefunden habe:
%Vor%Es druckt:
%Vor%Meine Frage ist, ist dies der beste Weg, um zu tun, was ich will, oder gibt es einen anderen einfacheren, besseren Weg?
Was Sie tun können, ist dies
%Vor% Dies sollte Ihnen erlauben, eine einfache list
of OffsetWithAttributes
Instanzen zu erstellen. Der Algorithmus bisect
sollte vollkommen glücklich sein, die definierten Operatoren zu verwenden.
Sie können Ihre someOWA.attributes['data']
verwenden.
Oder
%Vor% Das sollte die OffsetWithAttributes
eher wie eine dict
machen.
Tags und Links python dictionary binary-search