Dict sortieren nach...

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

Hier geht es zur Doku von "operator.itemgetter".
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,
sea-live hat geschrieben:mich stört halt nur das lamda bereits ab 2.4 für diese dinge optimiert wurde
die itemgetter-Funktion ist schneller als die lambda-Funktion.
ich soll nun fürs bessere verständniss eine bibliotek nachladen was
beim compalieren dann zusätzlichen platz beansprucht.
Gerade getestet: Die lambda-Variante ist kompiliert größer als die itemgetter-Variante:

Code: Alles auswählen

l = [[1,2,3,4]]
print filter(lambda x: x[2], l)
Größe: 271 Bytes.

Code: Alles auswählen

import operator
l = [[1,2,3,4]]
print filter(operator.itemgetter(2), l)
Größe: 224 Bytes.

Gruß,
Manuel
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sea-live hat geschrieben:mich stört halt nur das lamda bereits ab 2.4 für diese dinge optimiert wurde
und in den standart namensraum übernommmen wurde
Quatsch. Lambda ist schon seit fast immer da (mindestens seit 1.5.x), die Überlegung war sogar, es für Python 3.0 wegzulassen, da viele Anwendungsbereiche für lambdas durch andere Konstrukte übernommen worden sind, etwa ``filter()`` und ``map()`` durch List Comprehensions, Attribut und Indexzugriff durch Itemgetter und Attrgetter, etc.
sea-live hat geschrieben:Diskusion erwünscht minimalismuss gefordert beim Programmieren!
Ich habe letztens ein Programm geschrieben, in dem ich reihenweise Scheme Grundfunktionen nachgebaut habe, aber sonderlich gut war das Programm nicht. Ich würde lieber Funktionen der Stdlib verwenden, als sie einfach so nachzubauen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

sea-live hat geschrieben:kann mal jemand diesen ominösen docu link hier einstellen
Oben gibt es ja schon ein Link, in der neuen Doku sind allerdings auch Beispiele: [mod]operator#operator.itemgetter[/mod]

EDIT: btw. zum Thema Sortieren, gibt es auch diese Seite im Wiki: [wiki]Sortierungs-Tutorium[/wiki]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

da sag ich mal DANKE

mit dem beitrag von Jens haben sich dann alle fragen erübrigt

wer suchet der findet dieser thread hats nun wirklich insich!
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

EyDu hat geschrieben:Außerdem würde man statt deinem Lambda-Ausdruck 'operator.itemgetter("Date")' verwenden.
Ich nicht. `itemgetter` sieht vielleicht sauberer aus, aber mich stört der zusätzliche Import sehr. Wenn `itemgetter` im Standard-Namespace *wäre*, würde ich es verwenden, aber so ist das Lambda-Konstrukt trotzdem handlicher - plus die Flexibilität, es später noch anzupassen, wenn man die Datenstruktur ändern sollte.

Leonidas hat geschrieben:Weil die Funktionalität von itemgetter dokumentiert ist und man nicht überlegen muss was irgendwelche Funktionen machen.
Und die von `lambda` nicht? Dann habe ich wohl 'ne andere Doku als du :p
Leonidas hat geschrieben:Außerdem ist er womöglich auch schneller.
Das ist soweit ich das sehe nur eine Mutmaßung.


sea-live:
In deinem Code-Beispiel ist die `main()`-Funktion reichlich witzlos, sofern `main()` nicht z.B. in der gängigen Bedingung `if __name__ == '__main__':` verpackt ist.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wir diskutieren doch jetzt nicht schon eine Seite darüber, oder? Ich glaube beide Seiten können die Argumente der anderen nachvollziehen (und wissen ganz genau, dass sie selbst im Recht sind ;-) ) und letzendlich endet es in einer Geschmacksfrage.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Dann ist wohl Tatsache, dass es zwei Lösungen gibt, die beide eingeschränkt sind und sich entsprechend nicht durchsetzen wollen? Oder gibt es vielleicht einfach zufällig beide, weil `lambda` es einfach kann und `itemgetter` aus vermutlichen Gründen der Überladung existiert? Wird es das System/Python-Zen von Innen auffressen? ZOMG!
BlackJack

Vielleicht resultiert `itemgetter()` ja auch aus der Überlegung heraus, dass ``lambda`` abgeschafft werden sollte. Konnte ja keiner ahnen, das der BDFL da doch noch einlenkt. :-)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Y0Gi hat geschrieben:
Leonidas hat geschrieben:Weil die Funktionalität von itemgetter dokumentiert ist und man nicht überlegen muss was irgendwelche Funktionen machen.
Und die von `lambda` nicht? Dann habe ich wohl 'ne andere Doku als du :p
Du Funktionalität von ``lambda`` schon, die von diesem speziellen Lambda nicht.
Y0Gi hat geschrieben:
Leonidas hat geschrieben:Außerdem ist er womöglich auch schneller.
Das ist soweit ich das sehe nur eine Mutmaßung.
``itemgetter()`` ist immerhin in C implementiert, das ``lambda`` ist Python-Code, daher ist die Mutmaßung gar nicht mal so abwegig.

Über den Import zu Argumentieren finde ich eher langweilig. Ich importiere in meinen Programmen was ich will, da muss ich mir im Fall der Stdlib keine Sorgen machen ob es installiert ist oder nicht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Leonidas hat geschrieben:Du Funktionalität von ``lambda`` schon, die von diesem speziellen Lambda nicht.
Dann müsste ich dir im Falle von `lambda x: x[0]` unterstellen, dass du Lambdas nicht verstanden hast. Ein noch einfacheres Beispiel gibt es wohl kaum.

Leonidas hat geschrieben:Über den Import zu Argumentieren finde ich eher langweilig. Ich importiere in meinen Programmen was ich will, da muss ich mir im Fall der Stdlib keine Sorgen machen ob es installiert ist oder nicht.
Es ging mir nicht darum, ob ich einen Import vertreten kann. Bei etwas aus der Stdlib geht das auf jeden Fall. Vielmehr stört mich, dass ich für ein so einfaches Konstrukt überhaupt etwas importieren muss*, wodurch mein gedanklicher Fluss beim Programmieren zumindest kurzzeitig unterbrochen wird. Dabei ist es ein gerne und zu Recht angeführtes Argument, dass man in Python sehr direkt und ohne Umschweife, etwa im Vergleich zu C, ein Problem bzw. dessen Lösung umsetzen kann.

*) Interessanterweise könnte man das auch vom `with`-Statement behaupten. Das allerdings ist IMHO nicht nur vielseitiger, sondern wird in kurzer Zeit auch ohne Import funktionieren.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Y0Gi hat geschrieben:Es ging mir nicht darum, ob ich einen Import vertreten kann. Bei etwas aus der Stdlib geht das auf jeden Fall. Vielmehr stört mich, dass ich für ein so einfaches Konstrukt überhaupt etwas importieren muss*, wodurch mein gedanklicher Fluss beim Programmieren zumindest kurzzeitig unterbrochen wird. Dabei ist es ein gerne und zu Recht angeführtes Argument, dass man in Python sehr direkt und ohne Umschweife, etwa im Vergleich zu C, ein Problem bzw. dessen Lösung umsetzen kann.
Man könnte auch alle Funktionen im operator-Modul als "einfach" ansehen und sich fragen, warum man die erst importieren muss. Aber das würde den Namensraum ziemlich zumüllen.

Ich würde auch nicht sagen, dass eine Funktion, die ein callable zurück gibt, das aus einer ihm übergebenen Liste den Wert eines vorher definierten Index zurückliefert, wirklich als "einfach" bezeichnet werden kann, selbst wenn das mit lambda ein Einzeiler ist.

Würde es lambda nicht geben, dann müsstest du extra eine Funktion schreiben (lambda ist ja nichts anderes). Aber lambda bleibt uns erhalten und man hat weiter die Möglichkeit 'sehr direkt und ohne Umschweife ein Problem, bzw. dessen Lösung umzusetzen'. Man muss das operator-Modul ja nicht verwenden. Will man aber Geschwindigkeit, dann ist lambda oft/meistens/immer die schlechtere Wahl. Und warum sollte ich eine Funktion (selbst einen Einzeiler) neu schreiben, wenn es die schon (besser) gibt? Dann mach ich halt den doofen import.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Wenn der doofe Import nicht wäre, wäre das auch gar kein Thema. (Beweisbare) Geschwindigkeit ist dagegen ein handfestes Argument. Ich werde in Zukunft den `operator`-Ansatz testen.

Nur so eine Idee: Gibt es nicht eine entsprechende Methode `__foo__`, die `itemgetter()` entspricht und die man zur Vermeidung des Imports von einem "rumliegenden" Typ oder Objekt abgreifen kann? So wie man z.B. `map(', '.join, names)` nutzen kann? Okay, das würde fragwürdiger Stil werden, aber man spart den Import ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

In Haskell ist der von dir sogenannte fragwürdige Stil an jeder Ecke anzutreffen. Nennt "point-free programming". Im bekanntesten Haskell-Tutorial wird außerdem darauf verwiesen, dass man es doch bitte nicht mit "pointless programming" verwechseln soll :D
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Y0Gi hat geschrieben:Nur so eine Idee: Gibt es nicht eine entsprechende Methode `__foo__`, die `itemgetter()` entspricht und die man zur Vermeidung des Imports von einem "rumliegenden" Typ oder Objekt abgreifen kann?
Ohne Callable ist das ja auch nichts kompliziertes:

Code: Alles auswählen

>>> import operator
>>> l = range(5)
>>> operator.itemgetter(2)
<operator.itemgetter object at 0x81a8dcc>
>>> i2 = operator.itemgetter(2)
>>> i2(l)
2
>>> l.__getitem__(2)
2
``attrgetter`` ist ja auch nur ein ``getattr()`` in einem Callable.

Closures sind schon toll, ``itemgetter`` funktioniert etwa so:

Code: Alles auswählen

>>> def yogi_itemgetter(index):
...     def actual_getter(obj):
...         return obj[index]
...     return actual_getter
... 
>>> yi2 = yogi_itemgetter(2)
>>> yi2(l)
2
Et voila, schon sind wir einen Import los. Alternativ kann man es einmal importieren und es dann in die __builtins__ injecten, aber wenn ich sehe das jemand die Builtins verändert bin ich in Steinigungsstimmung ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Ein bisschen komplexer ist `operator.itemgetter()` schon, jedenfalls ab Python 2.5:

Code: Alles auswählen

In [41]: operator.itemgetter(1,3,0)('hallo')
Out[41]: ('a', 'l', 'h')
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Aha!
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

man hat mich auf der ersten aseite gerügt wegen des alters des anfangstreades ich finde diese diskussion über diesen operator sehr informatif

wollte ich nur mal loswerden

auch alte camelle sind nicht ausgestanden und benötigen von zeit zu zeit eine auffrischung

ahnungslose wie ich suchen nach den einfachsten lösungen mit umständlichsten methoden

DANKE an die Freaks hier EyDu und BlackJack für das unermuetliche angachmang!

mercy
Antworten