2016-08-20 60 views
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問題是針對不存儲像我這樣的對象的字典。任何幫助將不勝感激!

回答

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)) 
相關問題