Группируйте значения 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 ответ:
Используйте
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'}