У меня есть коллекция объектов новостных статей, которые я хочу отображать в архиве по отдельным месяцам. Я использовал itertools.groupby
для создания списка объектов Python, упорядоченных таким образом:
news_grouped = [
{'date': key, 'list': list(val)}
for key, val in groupby(obj_list,
(lambda v: datetime.datetime(v.pub_date.year,
v.pub_date.month, 1)))
]
Итак, я получаю коллекцию вроде:
[{'date': datetime.datetime(2011, 1, 1, 0, 0),
'list': [<News: A January Article>, <News: Another January Article>]},
{'date': datetime.datetime(2010, 12, 1, 0, 0),
'list': [<News: Happy Xmas>]},
{'date': datetime.datetime(2010, 10, 1, 0, 0),
'list': [<News: Halloween>]},
{'date': datetime.datetime(2010, 1, 1, 0, 0),
'list': [<News: Old old old Jan 2010>]}]
Я хотел бы заполнить коллекцию news_grouped так, чтобы она включала запись для каждого месяца между самой старой статьей и сегодняшней датой, при этом пустые списки просто имеют пустой список.
Я понимаю, что могу сделать это, перебирая от самой старой даты до самой новой даты и заполняя коллекцию, но кое-что об этом просто не совсем подходит мне, и я думаю, что это тоже не очень эффективно.
Есть ли более элегантный способ решения этой проблемы? Кто-нибудь может указать мне на один?
(На самом деле я использую Django и использовал regroup, но, похоже, мне лучше решить эту проблему в python вне шаблонов - я, конечно, могу ошибаться)
Большое спасибо.
Людо.