2016-08-20 7 views
2

Ich habe eine Sammlung von Objekten in einem Wörterbuch gespeichert, und ich möchte den maximalen Wert eines bestimmten Attributs abrufen. Bei den Objekten handelt es sich um Cookies (denken Sie an Chocolate Chip), und jeder Cookie hat seine eigene Temperatur, Wärmekapazität, Chargennummer usw. Die Chargennummer beschreibt, aus welchem ​​Satz von Keksen er den Ofen verlässt.Maximaler Wert eines Attributs von Objekten in einem Wörterbuch finden

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 
    ... 

Ich möchte die maximale Chargennummer im Wörterbuch finden. Ich weiß, das wäre einfach, wenn ich eine Liste verwende, ich könnte einfach operator.attrgetter ('batch') verwenden, um die Liste zu sortieren und den Wert zu erhalten. Um jedoch ein Wörterbuch verwenden, wird diese Zeile nicht:

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

ich im Wörterbuch einer for-Schleife und gehen durch jedes einzelne Objekt einrichten könnte, aber ich fühle es einen besseren Weg, dies zu tun ist. Ich möchte vermeiden, zu einer Liste zu wechseln, weil ich eine Optimierung durchführe, die Cookies in Kästchen sortiert, und es ist schneller, Daten aus einem Wörterbuch als aus einer Liste abzurufen, wenn Sie sich um 2000 Cookies kümmern müssen. (Ich habe es mit timeit()) zeitlich abgestimmt. Ich habe nach ähnlichen Fragen auf Stackoverflow gesucht, aber die meisten von ihnen scheinen in Javascript zu sein. Die Python-Fragen, die ich gefunden habe, sind für Wörterbücher, die keine Objekte wie meine speichern. Jede Hilfe würde sehr geschätzt werden!

Antwort

1

Sie könnten nur max auf den Werten verwenden:

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

Oder nur ein Klassenattribut verwenden, um den max zu halten:

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 

Dann:

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

Vielen Dank! Das hat bei mir funktioniert: cookie_maxbatch = max (cookies.values ​​(), key = operator.attrtter ('batch')) nbatches = cookie_maxbatch.getbatch() – magnoliafork

+0

@magnoliafork, keine Sorge, gern geschehen. –

+0

Um das Offensichtliche zu sagen, die letztere Technik ist nicht geeignet, wenn Cookies jemals entfernt oder aktualisiert werden – FujiApple

0

Hier ist ein Weg zu tun

# where objs is your dictionary of cookies 
max(map(lambda i: objs[i].batch, objs)) 
Verwandte Themen