2016-04-22 15 views
0

Ich habe 5 Bereiche:Was ist der schnellste Weg zu überprüfen, ob eine Zahl in einem bestimmten Bereich in Python ist?

1-50 ---> "range1" 
51-100 ---> "range2" 
101-150 ---> "range3" 
151-200 ---> "range4" 
201-250 ---> "range5" 

Bereiche nicht überlappen, wobei jeder Bereich untere und obere Schranke neben Bereich beginnt, wo der vorherige hat endet. Ich entscheide über die Reichweiten. Sie sind vielleicht nicht gleich groß.

Ich habe eine Variable, die eine Reihe zeigt, zum Beispiel

x = 153 

Wenn x zwischen 1 und 50, dann sollte es zurück „range1“, wenn zwischen 51 und 100, dann „range2“, und so weiter . Was ist der schnellste Weg, es in Python zu tun, wenn man bedenkt, dass es mehr als 5 Bereiche gibt, und die Anzahl groß ist?

+0

Sind die Zahlen eher in einigen bekannten Bereichen als in anderen? – rightfold

+0

Nein, die Zahl könnte mit gleicher Wahrscheinlichkeit in einem der Bereiche liegen. – alwbtc

+0

Wie bekommen Sie diese Bereiche? sind sie 2 ints in einem Array? überlappen sie sich? Sind die Bereiche spärlich? – karina

Antwort

1

Da Ihre Bereiche sind streng benachbart und in ansteigender Reihenfolge, können Sie bisection verwenden:

from bisect import bisect 

ranges = [1, 51, 101, 151, 201] 
if 0 < x <= 250: 
    print('range{}'.format(bisect(ranges, x)) 
else: 
    print('Out of bounds') 

Bisection nimmt O (log N) Schritte, um den Anpassungsbereich von N Möglichkeiten zu finden.

+0

funktioniert das nur, wenn die Bereiche so aneinander stoßen ... @alwbtc ist das der Fall? – karina

+0

Das ist schneller als mit einer traditionellen 'if'-Schleife? – alwbtc

+0

@karina ja, sie sind gegeneinander. – alwbtc

Verwandte Themen