Группируйте значения dict в блоки с помощью python


Я пытаюсь найти способ группировать значения словаря в интервалы, в зависимости от значения ключа.

В моем случае у меня есть два ключа: 'timestamp' и 'value'; мне нужно сгруппировать его по интервалам на основе значения. Моя структура данных такова:

[{'timestamp': u'1389631816', 'value': u'0'},
 {'timestamp': u'1389633136', 'value': u'0'},
 {'timestamp': u'1389633256', 'value': u'1'},
 {'timestamp': u'1389633316', 'value': u'1'},
 {'timestamp': u'1389633196', 'value': u'0'},
 {'timestamp': u'1389633196', 'value': u'0'},
 {'timestamp': u'1389633196', 'value': u'0'},
 {'timestamp': u'1389633316', 'value': u'1'}]

В этом случае у меня должно быть 4 группы:

First Group: 2 items, based on value '0';
Second Group: 2 items, based on value '1';
Third Group: 3 items, based on value '0';
Fourth Group: 1 item, based on value '1'.

Для всех целей мне нужны метрики между временами этих групп (приходящие для проверки ICMP из Zabbix в этом примере), чтобы создать отчет, но я действительно застрял здесь.

1 2

1 ответ:

Используйте itertools.groupby() функция для их группировки:

from itertools import groupby
from operator import itemgetter

for value, group in groupby(list_of_dicts, key=itemgetter('value')):
    print 'Group for value {}'.format(value)
    for d in group:
        print d

Демо:

>>> from itertools import groupby
>>> from operator import itemgetter
>>> list_of_dicts = [{'timestamp': u'1389631816', 'value': u'0'},
...  {'timestamp': u'1389633136', 'value': u'0'},
...  {'timestamp': u'1389633256', 'value': u'1'},
...  {'timestamp': u'1389633316', 'value': u'1'},
...  {'timestamp': u'1389633196', 'value': u'0'},
...  {'timestamp': u'1389633196', 'value': u'0'},
...  {'timestamp': u'1389633196', 'value': u'0'},
...  {'timestamp': u'1389633316', 'value': u'1'}]
>>> for value, group in groupby(list_of_dicts, key=itemgetter('value')):
...     print 'Group for value {}'.format(value)
...     for d in group:
...         print d
... 
Group for value 0
{'timestamp': u'1389631816', 'value': u'0'}
{'timestamp': u'1389633136', 'value': u'0'}
Group for value 1
{'timestamp': u'1389633256', 'value': u'1'}
{'timestamp': u'1389633316', 'value': u'1'}
Group for value 0
{'timestamp': u'1389633196', 'value': u'0'}
{'timestamp': u'1389633196', 'value': u'0'}
{'timestamp': u'1389633196', 'value': u'0'}
Group for value 1
{'timestamp': u'1389633316', 'value': u'1'}