2016-06-23 21 views
1

So habe ich my question answered auf wie der Mindestwert zu finden, aber was ist, wenn ich das Mindestobjekt wollen? Können wir diesen Code ähnlich vereinfachen?Python Finden Sie Minimum-Objekt mit speziellen Komparator

 min = 9999 
     minChild = None 
     for child in currentRoot.children:    
      if child.score < min: 
       min = child.score 
       minChild = child 
      recurseWriteBook(child, depth+1) 
+1

Ist Ihre Rekursion gebrochen? Sie rufen eine 'recurse ...()' -Funktion auf, geben nichts zurück, deklarieren keine globalen Variablen und erhalten keinen Rückgabewert von der Funktion. Sie können ein paar Zeilen entfernen, indem Sie minChild.score ansehen und nicht "min" (ein Name, den Sie in Ihrer verknüpften Frage nicht verwenden sollten), aber es ist nicht klar, ob Sie alles vereinfachen können, ohne alle zu sehen davon. Sie können 'min()' jedoch nicht auf verschachtelten Strukturen verwenden. – TessellatingHeckler

+0

Nein, alles funktioniert, außer dass ich meine min = 9999 auf 1 << 31 erhöhen musste, aber ich denke, ich habe meine Funktion geändert, so dass sie nicht mehr rekursiv ist. Ich schreibe nur auf die Festplatte, während ich tiefer in den Baum eindringe . Es schien einfacher, es vorwärts zu treiben, da ich keine Blattknoten benötige wie ich, wenn ich minimiere. Wenn Sie an der ganzen Funktion interessiert sind, ist es hier: http://pastebin.com/xVue2i5c – Josh

Antwort

1

Verwenden eingebaute Funktion min(iterable[, key]):

>>> class Foo(object): 
...  def __init__(self, value): 
...   self.value = value 
... 
>>> 
>>> l = [Foo(2), Foo(1), Foo(3)] 
>>> 
>>> 
>>> min_foo = min(l, key = lambda x: x.value) 
>>> 
>>> min_foo.value 
1 

Sie sagen, welche key/Attribut verwendet werden, um Objekte zu vergleichen.

0

Sie kennen Ihre Typen (Liste/Tupel) und wie sie justieren, so dass Sie können Technik wie folgt verwenden:

list_min = [1,2,3,4] # list to demonstrate 

m = lambda mn,lst: filter(lambda x: x <mn,lst) # get the minimum out of list 

minimum = 3 # test value 
print m(minimum,list_min) 
0

habe ich die Antwort, die ich ausgewählt und die Antwort von meiner anderen Frage, diese zu verwenden:

minChild = min(currentRoot.children, key = lambda child: child.score) 
+0

musste auch sicherstellen, dass ich noch meine Funktion aufgerufen habe, tiefer in den Baum zu kommen. – Josh