2016-08-20 3 views
2

У меня есть коллекция объектов, хранящихся в словаре, и я хочу получить максимальное значение для определенного атрибута. Объекты - куки (думаю, шоколадный чип), и каждый cookie имеет собственную температуру, теплоемкость, номер партии и т. Д. Номер партии описывает, какой набор куки он выходил из духовки.Поиск максимального значения атрибута объектов в словаре

class Cookie: 
def __init__(self, density, specificheat, batch): 
    self.rho = density 
    self.cp = specificheat 
    self.batch = batch 
    self.volume = 1.2e-5  # m^3 
    self.surfarea = 4.9e-3  # m^2 
    ... 

Я хочу найти максимальное количество партий в словаре. Я знаю, что это было бы просто, если бы я использовал список, я мог бы просто использовать operator.attrgetter ('batch') для сортировки списка и получения значения. Однако, используя словарь, эта линия не работает:

sorted(cookies, key=operator.attrgetter('batch')) 

Я мог бы создать для цикла и пройти через каждый отдельный объект в словаре, но я чувствую, что есть лучший способ сделать это. Я хочу избежать перехода на список, потому что я запускаю оптимизацию, сортирующую файлы cookie в ящики, и быстрее извлекать данные из словаря, чем из списка, когда вам приходится беспокоиться о 2000 куках. (Я приурочил его с помощью timeit()). Я искал похожие вопросы в Stackoverflow, но большинство из них, похоже, находятся в javascript. Вопросы Python, которые я нашел, предназначены для словарей, которые не хранят такие объекты, как мои. Любая помощь будет принята с благодарностью!

ответ

1

Вы могли бы просто использовать макс на значения:

mx_batch = max(cookies.values(), key=operator.attrgetter('batch')).batch 

Или просто использовать атрибут класса, чтобы сохранить макс:

class Cookie: 
    mx = 0 
    def __init__(self, density, specificheat, batch): 
     self.rho = density 
     self.cp = specificheat 
     self.batch = batch 
     self.volume = 1.2e-5  # m^3 
     self.surfarea = 4.9e-3  # m^2 
     if batch > Cookie.mx: 
      Cookie.mx = batch 

Тогда:

In [9]: c1 = Cookie(1, 120, 1) 

In [10]: c2 = Cookie(2, 120, 4) 

In [11]: c3 = Cookie(1, 120, 2) 

In [12]: c4 = Cookie(1, 120, 1) 

In [13]: print(Cookie.mx) 
4 
+0

Спасибо! Это сработало для меня: cookie_maxbatch = max (cookies.values ​​(), key = operator.attrgetter ('batch')) nbatches = cookie_maxbatch.getbatch() – magnoliafork

+0

@magnoliafork, не беспокойтесь, пожалуйста. –

+0

Чтобы указать на очевидное, последний метод не подходит, если файлы cookie удаляются или обновляются – FujiApple

0

Вот один способ сделать это

# where objs is your dictionary of cookies 
max(map(lambda i: objs[i].batch, objs)) 
Смежные вопросы