只需提取要分组的方面;如果您想按小时分组,则需要提取一个属性:
from itertools import groupby
[list(g) for k, g in groupby(list_of_dts, key=lambda d: d.hour)]
或使用operator.attrgetter() 代替 lambda:
from itertools import groupby
from operator import attrgetter
[list(g) for k, g in groupby(list_of_dts, key=attrgetter('hour'))]
请注意groupby() 不会排序;它只会产生具有相同分组键的连续值组。
如果您需要对 未排序 值进行分组,那么最好在字典中进行分组:
grouped = {}
for dt in list_of_dts:
grouped.setdefault(dt.hour, []).append(dt)
result = grouped.values()
或者,按小时对输出进行排序:
result = [grouped[hour] for hour in sorted(grouped)]
演示:
>>> import datetime
>>> from itertools import groupby
>>> from operator import attrgetter
>>> list_of_dts = [
... datetime.datetime(2012,1,1,0,0,0),
... datetime.datetime(2012,1,1,0,1,0),
... datetime.datetime(2012,1,1,1,8,0),
... datetime.datetime(2012,1,2,0,5,0),
... datetime.datetime(2012,1,2,1,4,0),
... ]
>>> [list(g) for k, g in groupby(list_of_dts, key=attrgetter('hour'))]
[[datetime.datetime(2012, 1, 1, 0, 0), datetime.datetime(2012, 1, 1, 0, 1)], [datetime.datetime(2012, 1, 1, 1, 8)], [datetime.datetime(2012, 1, 2, 0, 5)], [datetime.datetime(2012, 1, 2, 1, 4)]]
>>> grouped = {}
>>> for dt in list_of_dts:
... grouped.setdefault(dt.hour, []).append(dt)
...
>>> [grouped[hour] for hour in sorted(grouped)]
[[datetime.datetime(2012, 1, 1, 0, 0), datetime.datetime(2012, 1, 1, 0, 1), datetime.datetime(2012, 1, 2, 0, 5)], [datetime.datetime(2012, 1, 1, 1, 8), datetime.datetime(2012, 1, 2, 1, 4)]]
>>> from pprint import pprint
>>> pprint(_)
[[datetime.datetime(2012, 1, 1, 0, 0),
datetime.datetime(2012, 1, 1, 0, 1),
datetime.datetime(2012, 1, 2, 0, 5)],
[datetime.datetime(2012, 1, 1, 1, 8), datetime.datetime(2012, 1, 2, 1, 4)]]