Существуют различные способы достижения этого.Вы можете использовать defaultdict
из модуля collections
.Но это также может быть сделано с использованием простого dict.setdefault
метода.
setdefault(key[, default])
Если ключ есть в словаре, вернуть его значение.Если нет, вставьте ключ со значением default и верните default . по умолчанию по умолчанию Нет .
Мы зациклим данные, разбив их на строки дня, месяца и года.Затем мы ищем в базовом дереве ключ года, и, если он не существует, мы создаем для него новый пустой элемент.Затем мы смотрим в ключе год для ключа месяца, создавая новый список для него, если он не существует.Наконец, мы добавляем строку дня к списку месяцев.
from pprint import pprint
data = [
'04/02/2018', '05/02/2018', '06/02/2018', '01/03/2018', '10/03/2018', '08/09/2017', '09/09/2017',
'11/10/2017', '11/12/2017', '14/06/2018', '15/06/2018', '24/07/2018', '26/07/2018', '30/08/2018',
'31/08/2018', '01/09/2018'
]
tree = {}
for s in data:
day, mon, year = s.split('/')
ydict = tree.setdefault(year, {})
mlist = ydict.setdefault(mon, [])
mlist.append(day)
pprint(tree)
output
{'2017': {'09': ['08', '09'], '10': ['11'], '12': ['11']},
'2018': {'02': ['04', '05', '06'],
'03': ['01', '10'],
'06': ['14', '15'],
'07': ['24', '26'],
'08': ['30', '31'],
'09': ['01']}}
Мы можем объединить 3 шага основного цикла в одну строку,но это немного сложнее читать:
for s in data:
day, mon, year = s.split('/')
tree.setdefault(year, {}).setdefault(mon, []).append(day)