Данные вашего примера и интуиция соответствуют следующему правилу: «Два значения находятся в одной группе, если расстояние между ними не превышает 1 стандартного отклонения, удаленного из средних расстояний между значениями во всей группе».
Вот код, который говорит то же самое:
from statistics import stdev
# sort the data, for simplicity
data = sorted([1.8, 1.1, 1.9, 11, 9, 10, 36, 39, 44, 20])
# create a list of the gaps between the consecutive values
gaps = [y - x for x, y in zip(data[:-1], data[1:])]
# have python calculate the standard deviation for the gaps
sd = stdev(gaps)
# create a list of lists, put the first value of the source data in the first
lists = [[data[0]]]
for x in data[1:]:
# if the gap from the current item to the previous is more than 1 SD
# Note: the previous item is the last item in the last list
# Note: the '> 1' is the part you'd modify to make it stricter or more relaxed
if (x - lists[-1][-1]) / sd > 1:
# then start a new list
lists.append([])
# add the current item to the last list in the list
lists[-1].append(x)
print(lists)
Вывод:
[[1.1, 1.8, 1.9], [9, 10, 11], [20], [36, 39, 44]]
Я предполагаю, что порядок сортировки не имеет значения.
Чтобы ответить на мой собственный вопрос в комментариях, если вы добавите 15 и 25, результат будет следующим:
[[1.1, 1.8, 1.9], [9, 10, 11], [15], [20], [25], [36, 39], [44]]
Обратите внимание, что после добавления 15 и 25 стандартное отклонение изменилось, поэтому 44 было отделенов своей собственной маленькой группе.Если к этому добавить 17, оно становится:
[[1.1, 1.8, 1.9], [9, 10, 11], [15, 17, 20], [25], [36, 39], [44]]
Или, если вы не добавите 17, а вместо этого потребуете, чтобы расстояние не превышало 1,6 SD:
[[1.1, 1.8, 1.9], [9, 10, 11, 15, 20, 25], [36, 39, 44]]