B.Mr.W. - 1 year ago 86
Python Question

# Python "R Cut" function

I am wondering if there is a function in Python already written for the goal that I describe later. If not, what would be the easiest way to implement. My code is attached.

Say I have a range from 1 to 999999999. Given a list of numbers like this:

``````[9, 44, 99]
``````

It would return

``````[(1,9), (10,44), (45,99), (100, 999999999)]
``````

If the number which are the limits are included in the input numbers, it should handle that also.
Say input is

``````[1, 9, 44, 999999999]
``````

The return should be:

``````[(1,9), (10,44), (45, 999999999)]
``````

I could write a for loop comparing with a few conditional statement but wondering if there is a more 'smart way'.

Some data massage that might be helpful:

``````points = [1, 9, 44, 99]
points = sorted(list(set(points + [1, 999999999])))
``````

UPDATED INFO:
FINAL CREDITS GIVEN TO alecxe, thanks for your inspiring list comprehension solution

``````l = sorted(list(set(points + [1, 999999999])))
[(l[i] + int(i != 0), l[i + 1]) for i in xrange(len(l) - 1)]
``````

You can put all that in one line but I think that is unnessary.

Not sure this approach is the best one:

``````>>> l = [1, 9, 44, 999999999]
>>> [(l[i] + int(i != 0), l[i + 1]) for i in xrange(len(l) - 1)]
[(1, 9), (10, 44), (45, 999999999)]
``````

If you are on python 3, replace `xrange` with `range`.

Note, that for your first example to work, you'll need to prepend and append your boundaries:

``````>>> l = [9, 44, 109]
>>> low, high = 1, 999999999
>>> l = [low] + l + [high]
>>> [(l[i] + int(i != 0), l[i + 1]) for i in xrange(len(l) - 1)]
[(1, 9), (10, 44), (45, 109), (110, 999999999)]
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download