填写Python groupby的日期

时间:2011-03-01 12:25:52

标签: python django itertools

我有一系列新闻文章对象,我希望以不同的月份存档。我使用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并且正在使用重新组合,但似乎我在模板之外的python中更好地解决这个问题 - 我当然可能是错的)

非常感谢。

1 个答案:

答案 0 :(得分:0)

正如Space_C0wb0y所建议的那样去一本字典,如果你喜欢使用自2.7以来属于集合模块的有序字典。

  1. 获取最古老的文章
  2. 通过从oldest.pub_date循环到今天的月份步骤,创建映射到空列表的dict键
  3. 遍历所有项目并附加到dict中的相应列表