Вопрос по python, math, list, grouping – Группировка списка целых чисел с ближайшими значениями

5

У меня есть список:

d = [23,67,110,25,69,24,102,109]

Как я могу сгруппировать ближайшие значения с динамическим разрывом, и создать кортеж, как это, какой метод самый быстрый? :

[(23,24,25),(67,69),(102,109,110)]
Как вы определяете «ближайшие значения»? На мой взгляд, 102 совсем не близок к 109 и принадлежит к своей собственной группе. Есть ли у вас объективный способ определения группировки? Kevin
K-означает кластеризацию. Joel Cornett
Я согласен с Кевином. Все это очень произвольно - и это хорошо - вам просто нужно более конкретно определить, как вы хотите разделить числа, а также как вы НЕ хотели бы, чтобы они были разделены. Joel Cornett
проблема здесь, у меня нет объективного способа, просто мне нужно, чтобы компьютер определил это, это может быть нечеткой логикой pylover
@pylover Компьютеры могут делать только то, что вы им говорите, если вы не можете описать логику, вы не можете ожидать, что компьютер придумает это для вас. Andrew Clark

Ваш Ответ

1   ответ
13

d = [23,67,110,25,69,24,102,109]

d.sort()

diff = [y - x for x, y in zip(*[iter(d)] * 2)]
avg = sum(diff) / len(diff)

m = [[d[0]]]

for x in d[1:]:
    if x - m[-1][0] < avg:
        m[-1].append(x)
    else:
        m.append([x])


print m
## [[23, 24, 25], [67, 69], [102, 109, 110]]

Сначала мы вычисляем среднюю разницу между последовательными элементами, а затем группируем элементы, разница которых меньше средней.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded pylover
Error: User Rate Limit Exceededd = [1,2,4,5]Error: User Rate Limit ExceededmError: User Rate Limit Exceeded[[1], [2], [4], [5]]Error: User Rate Limit Exceeded[[1, 2], [4, 5]]Error: User Rate Limit ExceededdiffError: User Rate Limit Exceededdiff = [data[i+1]-data[i] for i in range(len(data)-1)]Error: User Rate Limit Exceededx - m[-1][-1] < avg.

Похожие вопросы