You could try this: Determine the difference for each pair of consecutive numbers, and from those determine the average difference.
nums = [101, 107, 106, 199, 204, 205, 207, 306, 310, 312, 312, 314, 317, 318,
380, 377, 379, 382, 466, 469, 471, 472, 557, 559, 562, 566, 569]
pairs = list(zip(nums, nums[1:]))
diffs = [abs(x-y) for x, y in pairs]
avg_diff = sum(diffs) / len(diffs) # ~ 18.31
Now, you can group the numbers by whether the difference to the previous number is lower or higher than that average:
groups = [[nums[0]]] # first group already has first number
for (x, y), d in zip(pairs, diffs):
if d < avg_diff:
groups[-1].append(y) # add to last group
else:
groups.append([y]) # start new group
Or if you prefer one-liners spanning three lines, this one might be for you:
groups = [functools.reduce(lambda A, b: A+(b[1],) if A else b, group, None)
for key, group in itertools.groupby(zip(nums, nums[1:]),
key=lambda t: abs(t[0]-t[1]) < 18.3) if key]
Result for your example is this:
[[101, 107, 106],
[199, 204, 205, 207],
[306, 310, 312, 312, 314, 317, 318],
[380, 377, 379, 382],
[466, 469, 471, 472],
[557, 559, 562, 566, 569]]
Of course, this breaks down if there are groups with vastly different group-internal differences, as in [1, 4, 2, 5, 1042, 1230, 920, 3, 2, 5]. If that is the case, you might try the relative difference of numbers instead, e.g. max(x,y)/min(x,y) instead of abs(x-y).