Заполните даты из группы Python - PullRequest
3 голосов
/ 01 марта 2011

У меня есть коллекция объектов новостных статей, которые я хочу отображать в архиве по отдельным месяцам. Я использовал 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 вне шаблонов - я, конечно, могу ошибаться)

Большое спасибо.

Людо.

1 Ответ

0 голосов
/ 01 марта 2011

По предложению Space_C0wb0y перейдите к словарю, если вам нравится использовать упорядоченный dict, который является частью модуля коллекций с 2.7.

  1. получить самую старую статью
  2. создать отображение ключей dict для пустых списков, выполнив цикл от старейшего.pub_date до сегодняшнего дня с шагом месяца
  3. цикл по всем пунктам и добавление в соответствующий список в dict
...