5

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

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

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

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

[(23,24,25),(67,69),(102,109,110)]
  • 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.

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от pylover
  • Я согласен с Кевином. Все это очень произвольно - и это хорошо - вам просто нужно более конкретно определить, как вы хотите разделить числа, а также как вы НЕ хотели бы, чтобы они были разделены.

    от Joel Cornett
  • @pylover Компьютеры могут делать только то, что вы им говорите, если вы не можете описать логику, вы не можете ожидать, что компьютер придумает это для вас.

    от Andrew Clark
  • Как вы определяете «ближайшие значения»? На мой взгляд, 102 совсем не близок к 109 и принадлежит к своей собственной группе. Есть ли у вас объективный способ определения группировки?

    от Kevin
  • проблема здесь, у меня нет объективного способа, просто мне нужно, чтобы компьютер определил это, это может быть нечеткой логикой

    от pylover
  • K-означает кластеризацию.

    от Joel Cornett
  • 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]]
    

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