Seite 1 von 1

minimum einer liste mit gewichteten objekten mit "min&a

Verfasst: Donnerstag 6. Mai 2010, 21:22
von LiLaLaunebär
hi,
habe eine liste mit objekten, die alle ein gewicht haben.
kann ich mit der min built-in funktion das objekt herausfinden, das das kleinste gewicht hat? kriegs nicht auf die reihe...also so à la

Code: Alles auswählen

a=[Objekt(),Objekt(),Objekt()]
print min(a...?)
achja, der abschnitt in der api lautet:
min(iterable[, args...][, key])¶

With a single argument iterable, return the smallest item of a non-empty iterable (such as a string, tuple or list). With more than one argument, return the smallest of the arguments.

The optional key argument specifies a one-argument ordering function like that used for list.sort(). The key argument, if supplied, must be in keyword form (for example, min(a,b,c,key=func)).
thx for help

Re: minimum einer liste mit gewichteten objekten mit "m

Verfasst: Donnerstag 6. Mai 2010, 21:44
von EyDu
LiLaLaunebär hat geschrieben:achja, der abschnitt in der api lautet:
Dann solltest du den Abschnitt vielleicht auch lesen. Dort steht nämlich die Antwort auf deine Frage.

Verfasst: Donnerstag 6. Mai 2010, 21:47
von LiLaLaunebär
vielen dank für deine hilfreiche antwort. obwohl ich des lesens mächtig bin komme ich damit nicht so ganz klar, da ich python neuling bin.
was ist mit diesem ominösen key gemeint? ich krieg das mit der syntax nicht gebacken. wie muss ich das target-attribut übergeben?

Verfasst: Donnerstag 6. Mai 2010, 21:56
von EyDu

Code: Alles auswählen

>>> min(range(5,10), key=lambda x: x**x % 15)
8
>>> map(lambda x: x**x % 15, range(5,10))
[5, 6, 13, 1, 9]
>>>

Verfasst: Donnerstag 6. Mai 2010, 22:02
von LiLaLaunebär
hey danke,

...lambdas sind mir neu...komm aus der Java ecke.

Verfasst: Donnerstag 6. Mai 2010, 22:06
von EyDu
Du musst keine lambdas verwenden, die habe ich nur benutzt, weil es so schön kurz war. Statt dessen kannst du auch eine "ganz normale" Funktion verwenden:

Code: Alles auswählen

>>> def spam(x):
...     return x**x % 15
...
>>> min(range(5,10), key=spam)
8

Verfasst: Freitag 7. Mai 2010, 06:33
von snafu
Der Sortierungsschlüssel ist optional. Die simpelste Form, um ein Minimum heraus zu kriegen geht so:

Code: Alles auswählen

>>> nums = [4,2,7,9,3]
>>> min(nums)
2

Verfasst: Freitag 7. Mai 2010, 07:38
von BlackJack
Wenn man nur `min(iterable)` angibt, dann müssen die enthaltenen Objekte allerdings vergleichbar sein, also zum Beispiel die `__cmp__()`-Methode entsprechend implementieren. Wenn die implementiert wird, sollte man auch die `__hash__()`-Methode überschreiben. Die Frage ist, ob das hier benötigte Kriterium eine Art "natürliche Ordnung" der Objekte darstellt. Falls nicht, sollte man `key` verwenden und `__cmp__()` nicht überschreiben.

Verfasst: Freitag 7. Mai 2010, 08:49
von snafu
Oder anders gesagt: Wenn die Klasse selbst quasi das Gewicht ist, macht das Implementieren von `__cmp__` Sinn, wenn hingegen das Gewicht als Attribut etwa gleichrangig mit Größe und Farbe auftritt (falls überhaupt "Gewicht" in diesem Sinne gemeint ist), sollte man es nicht tun und besser einen Sortierungsschlüssel mitgeben. Das ist natürlich sehr abstrakt erklärt. Der konkrete Anwendungsfall würde wie immer ganz sicher weiterhelfen.