Нахождение максимального значения атрибута объектов в словаре

python object dictionary

604 просмотра

2 ответа

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

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

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

Автор: magnoliafork Источник Размещён: 08.11.2019 11:28

Ответы (2)


1 плюс

Решение

Вы можете просто использовать max для значений:

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
Автор: Padraic Cunningham Размещён: 20.08.2016 03:15

0 плюса

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

# where objs is your dictionary of cookies
max(map(lambda i: objs[i].batch, objs))
Автор: qfwfq Размещён: 20.08.2016 03:17
Вопросы из категории :
32x32