2015-01-13 3 views
-2

У меня есть числовой список:питон подсчета частоты элементов

numlist = [601, 601, 601, 602, 602, 603, 1245, 1245, 1245, 1245, 1247, 1249, 1250,602,602] 

Этот список будет всегда «сортировать», как показано на рисунке, со значениями перезагружающих после определенного момента.

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

Ожидаемый результат:

>>>result 
[6,4,1,2,2] 

можно сделать:

>>>from itertools import groupby 
>>>[len(list(group)) for key, group in groupby(numlist)] 
[3, 2, 1, 4, 1, 1, 1, 2] 

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

Больше объяснения:

Перейти по списку, если следующий элемент имеет то же значение, или же значение +1, группировать их.

ответ

3

Применить itertools.groupby дважды:

from itertools import groupby 

numlist = [601, 601, 601, 602, 602, 603, 1245, 1245, 1245, 1245, 1247, 1249, 1250,602,602] 
group_first = ((k, sum(1 for _ in g)) for k, g in groupby(numlist)) 

Здесь после первой группировкой мы будем иметь что-то вроде:

[(601, 3), (602, 2), (603, 1), (1245, 4), (1247, 1), (1249, 1), (1250, 1), (602, 2)] 

Теперь снова нужно сгруппировать эти элементы (по первому пункту), но фокус здесь следует использовать enumerate для группировки последовательных элементов. Разница таких предметов с их соответствующими индексами всегда будет одинаковой (Oh! И BTW я узнал, что из Python 2.6 itertools documentation ;-)).

for k, g in groupby(enumerate(group_first), lambda (i, x):i-x[0]): 
    print sum(v for i, (k, v) in g) 
+0

Работает отлично, спасибо! – Chargaff

+1

Вау, спасибо за объяснение, теперь это яснее! – Chargaff

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