Как мне группировать этот список dicts в тот же месяц?

Python newb … У меня есть список dicts, который я пытаюсь организовать в тот же месяц и год:

[{'date':'2008-04-23','value':'1'}, {'date':'2008-04-01','value':'8'}, {'date':'2008-04-05','value':'3'}, {'date':'2009-04-19','value':'5'}, {'date':'2009-04-21','value':'8'}, {'date':'2010-09-09','value':'3'}, {'date':'2010-09-10','value':'4'}, ] 

То, что я пытаюсь получить, – это список таких диктофонов:

 [{'date':2008-04-01,'value':'12'}, {'date':2009-04-01,'value':'13'}, {'date':2010-09-01,'value':'7'}, ] 

Вот мой код, который просто печатает пустой список:

 from datetime import datetime myList = [{'date':'2008-04-23','value':'1'}, {'date':'2008-04-01','value':'8'}, {'date':'2008-04-05','value':'3'}, {'date':'2009-04-19','value':'5'}, {'date':'2009-04-21','value':'8'},{'date':'2010-09-09','value':'3'}, {'date':'2010-09-10','value':'4'}, ] newList = [] newDict = {} for cnt in range(len(myList)): for k,v in myList[cnt].iteritems(): if k == 'date': d = datetime.strptime(v,'%Y-%m-%d').date() for elem in newList: if elem['date'] != d: newList.append({'date':d,'value':myList[cnt]['value']}) else: newList[cnt]['value'] += myList[cnt]['value'] print newList 

2 Solutions collect form web for “Как мне группировать этот список dicts в тот же месяц?”

Во-первых, я бы сортировал данные 1 :

 >>> lst = [{'date':'2008-04-23','value':'1'}, ... {'date':'2008-04-01','value':'8'}, ... {'date':'2008-04-05','value':'3'}, ... {'date':'2009-04-19','value':'5'}, ... {'date':'2009-04-21','value':'8'}, ... {'date':'2010-09-09','value':'3'}, ... {'date':'2010-09-10','value':'4'}, ... ] >>> lst.sort(key=lambda x:x['date'][:7]) >>> lst [{'date': '2008-04-23', 'value': '1'}, {'date': '2008-04-01', 'value': '8'}, {'date': '2008-04-05', 'value': '3'}, {'date': '2009-04-19', 'value': '5'}, {'date': '2009-04-21', 'value': '8'}, {'date': '2010-09-09', 'value': '3'}, {'date': '2010-09-10', 'value': '4'}] 

Тогда я бы использовал itertools.groupby для группировки:

 >>> from itertools import groupby >>> for k,v in groupby(lst,key=lambda x:x['date'][:7]): ... print k, list(v) ... 2008-04 [{'date': '2008-04-23', 'value': '1'}, {'date': '2008-04-01', 'value': '8'}, {'date': '2008-04-05', 'value': '3'}] 2009-04 [{'date': '2009-04-19', 'value': '5'}, {'date': '2009-04-21', 'value': '8'}] 2010-09 [{'date': '2010-09-09', 'value': '3'}, {'date': '2010-09-10', 'value': '4'}] >>> 

Теперь, чтобы получить желаемый результат:

 >>> for k,v in groupby(lst,key=lambda x:x['date'][:7]): ... print {'date':k+'-01','value':sum(int(d['value']) for d in v)} ... {'date': '2008-04-01', 'value': 12} {'date': '2009-04-01', 'value': 13} {'date': '2010-09-01', 'value': 7} 

1 Ваши данные на самом деле уже сортируются в этом отношении, поэтому вы можете пропустить этот шаг.

Используйте itertools.groupby :

 data = [{'date':'2008-04-23','value':'1'}, {'date':'2008-04-01','value':'8'}, {'date':'2008-04-05','value':'3'}, {'date':'2009-04-19','value':'5'}, {'date':'2009-04-21','value':'8'}, {'date':'2010-09-09','value':'3'}, {'date':'2010-09-10','value':'4'}, ] import itertools key = lambda datum: datum['date'].rsplit('-', 1)[0] data.sort(key=key) result = [{ 'date': key + '-01', 'value': sum(int(item['value']) for item in group) } for key, group in itertools.groupby(data, key=key)] print result # [{'date': '2008-04-01', 'value': 12}, # {'date': '2009-04-01', 'value': 13}, # {'date': '2010-09-01', 'value': 7}] 
  • Каков наиболее эффективный способ поиска вложенных списков в python?
  • Имейте то же README как в Markdown, так и в reStructuredText
  • Python: получить имя файла из filepointer
  • PyCharm 5.0.1 не разрешает встроенные модули / методы
  • Клавиша по умолчанию для встроенных функций Python max / min
  • Как избежать «Не удалось получить токен доступа: {« error »:« invalid_grant »} в автономных задачах CAE cron?
  • Есть ли прямой подход к форматированию чисел в jinja2?
  • область доступа переменной для цикла
  • Как сделать правильный тик сервера с помощью python?
  • Почему этот код не работает (Leetcode в Python)?
  • Понимание dict.copy () - неглубоко или глубоко?
  •  
    Interesting Posts for Van-Lav

    Clojure эквивалентен функциям Python «any» и «all»?

    Постоянное изменение sys.path … хорошая идея или нет?

    Импорт / контекст флажка-SQLAlchemy

    Поймать исключение потока в потоке вызывающего в Python

    Программное редактирование источника Python

    REST API, работающая с моей программой python вместо базы данных

    Вернуть True, если все символы в строке находятся в другой строке

    Почему целые числа в кортежей строк базы данных имеют суффикс «L»?

    Как читать аудиофайлы в Python, аналогичные аудиозаписям Matlab?

    Внутренняя ошибка сервера при вводе точек с использованием JSON в InfluxDB

    Как настроить файл «styles.less» Atom, чтобы выделить функцию и вызов метода в Python?

    Файловые системы хранят информацию о часовом поясе?

    Как написать класс генератора?

    Как построить 32-битный python 2.6 на 64-битной Linux?

    Получение ошибки "не может передавать входной массив из формы (252,4) в форму (4)" в оптимизации

    Python - лучший язык программирования в мире.