Assuming all the ranges include unit differences only, it's worth to start with a search of indexes where to split:
split_idx = np.flatnonzero(np.diff(ls, prepend = ls[0], append=ls[-1])!=1)
Note that it is improved slightly in order to insert starting and ending indexes as well. A further work could be done like so:
bounding_points = np.transpose([split_idx[:-1], split_idx[1:]])
out = [range(ls[n], ls[m-1]+1) for n, m in bounding_points.tolist()]
Sample run:
>>> ls = [1, 2, 3, 10, 11, 12, 13, 16, 18, 19]
>>> split_idx
array([ 0, 3, 7, 8, 10], dtype=int32)
>>> bounding_points
array([[ 0, 3],
[ 3, 7],
[ 7, 8],
[ 8, 10]], dtype=int32)
>>> out
[range(1, 4), range(10, 14), range(16, 17), range(18, 20)]