minimum einer liste mit gewichteten objekten mit "min&a

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
LiLaLaunebär
User
Beiträge: 55
Registriert: Sonntag 11. April 2010, 14:41

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
LiLaLaunebär
User
Beiträge: 55
Registriert: Sonntag 11. April 2010, 14:41

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?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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]
>>>
Das Leben ist wie ein Tennisball.
LiLaLaunebär
User
Beiträge: 55
Registriert: Sonntag 11. April 2010, 14:41

hey danke,

...lambdas sind mir neu...komm aus der Java ecke.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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
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.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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