使用对象属性将列表转换为列表列表

时间:2016-04-04 13:53:57

标签: python

我有一个对象列表

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])

这确实给出了正确的结果,但我只想知道最佳解决方案。

1 个答案:

答案 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()