2016-04-04 2 views
3

У меня есть список объектовсписок Включить в список списков с использованием атрибута объекта

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

это действительно дает правильный результат, но я просто интересно об оптимальном решении.

ответ

6

Вы можете использовать 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() 
+0

Вам нужно будет отсортировать 'objects' с' key = attrgetter ('date') 'first, если он еще не отсортирован по' date'. 'groupby' действует как GNU, используя' uniq'; он группирует только смежные записи. Конечно, если он уже отсортирован, то повторная сортировка будет незначительной (благодаря оптимизации TimSort для уже отсортированных списков), а 'groupby' победит на производительности, когда сортировка будет дешевой. – ShadowRanger

+0

Вы забыли упомянуть одну вещь, список должен быть отсортирован, иначе результат groupby будет некорректным в некоторых случаях. – AndreyT

+0

Да, я редактировал ответ, спасибо за ваше внимание. – Kasramvd

Смежные вопросы