我有一个对象列表
objects = [<object 1>, <object 2>, <object 3>, <object 4>, <object 5>, <object 5>]
每个对象都有一个属性日期(object.date)。我想将列表拆分为列表列表,其中每个子列表只有具有相同日期的对象。 有一些聪明的方法吗? 我天真的解决方案是
list_of_lists = []
for object in objects:
success = 0
for list in list_of_lists:
if object.date == list[0].date:
list.append(object)
success = 1
break
if not success:
list_of_lists.append([object])
这确实给出了正确的结果,但我只想知道最佳解决方案。
答案 0 :(得分:7)
您可以使用itertools.groupby()
:
from itertools import groupby
from operator import attrgetter
my_lists = [list(g) for _, g in groupby(sorted(objects, key=attrgetter('date')), attrgetter('date'))]
请注意,如果您的对象已按日期属性排序,则无需对其进行排序。
根据您的需要,如果您在运行时速度方面需要更高的性能,可以使用字典对对象进行分类:
my_dict = {}
for obj in objects:
my_dict.setdefault(obj.date, []).append(obj) # Don't forget to call the `date` if it's callable
请注意,如果您只想要分类表单中的列表,则可以获取字典值:
my_lists = my_dict.values()