Question: I'm refactoring a function that, given a series of endpoints that implicitly define intervals, checks if a number is included in the interval, and then return a corresponding (not related in any computable way).
The code that is now handling the work is:

```
if p <= 100:
    return 0
elif p > 100 and p <= 300:
    return 1
elif p > 300 and p <= 500:
    return 2
elif p > 500 and p <= 800:
    return 3
elif p > 800 and p <= 1000:
    return 4
elif p > 1000:
    return 5

```

Which is IMO quite horrible, and lacks in that both the intervals and the return values are hardcoded.
Any use of any data structure is of course possible.

Answer: 
```
import bisect
bisect.bisect_left([100,300,500,800,1000], p)

```

here the docs: [bisect](https://docs.python.org/3.7/library/bisect.html)
Another way ...

```
def which(lst, p): 
    return len([1 for el in lst if p > el])

lst = [100, 300, 500, 800, 1000]
which(lst, 2)
which(lst, 101)
which(lst, 1001)

```