2016-10-28 3 views
0

У меня есть список чисел, и мне нужно сгруппировать его. itertools.grouby работа идеально подходит для последовательностей одинаковых номеров, но мне нужно такое же поведение для чисел с порогом (2-3%)Python groupby threshold

E.X: lst = [1, 500, 19885, 19886, 19895, 90000000] и я ожидаю [[1], [500], [19885, 19886, 19895], [90000000]]

Можете ли вы предложить мне что-нибудь?

ответ

1

Вы все еще можете использовать groupby но использовать пользовательский компаратор:

class MyValue: 
    def __init__(self, val): 
     self.val = val 
    def __eq__(self, other): 
     # 2% leeway 
     return self.val*0.98 <= other.val <= self.val*1.02 

А потом:

for key, group in groupby(map(MyValue, values)): 
    group_values = [el.val for el in group] 

Обратите внимание, что это будет держать первое значение в качестве «ссылки», так в группе вас» ll имеют элементы до 2% от ключевого/первого значения, но внутри группы отклонение может увеличиться до 4%.

Это должно быть хорошо с данными, которые вы показали, были разные группы, но они не были надежными с близкими группами.

+0

очень приятно! Для эквивалентного результата напишите 'res = [[el.val для el in g] для ключа, g в groupby (map (MyValue, values))] вместо второго кодового блока. – hvwaldow

+0

Удивительный, каждый раз забывайте о магических методах. Собираюсь использовать его – struckoff

0

Ведро их. Вам нужно будет вручную разбить перерывы заранее. Можете ли вы разобраться, заранее? Это облегчило бы это.

Фактически, если вы используете журнал, то мультипликативный порог превращается в постоянный порог, например. 0.98..1.02 в log-land ~ = (-0,02, +0,02). Итак, используйте журнал всех ваших номеров. Вам все равно придется вешать их, прежде чем делать groupby.

Если вы хотите код, дайте нам лучший (случайный) воспроизводимый пример, в котором больше номеров, проверяющих угловые шкафы.

+0

что вы имеете в виду о ковше? на самом деле я не могу сортировать его, потому что заказ необходим. – struckoff

+0

«Ведро» означает «делить диапазон на бункеры и использовать квантованное значение для целей группировки» - похоже на то, что показал @ Бакуриу. Так же, как в гистограмме. – smci

 Смежные вопросы

  • Нет связанных вопросов^_^