Liste aus Dicts - Position des n-größten Elementes finden

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
AllesMeins
User
Beiträge: 63
Registriert: Donnerstag 20. November 2003, 13:45
Wohnort: Frankfurt/M.

Folgendes Problem Ich habe eine Liste bestehend aus dictionaries. Jedes dict hat den key "score". Nun möchte ich z.B. die Position des zehnt-größten Elementes finden. Dabei ist es wichtig, dass ich wirklich die Position finde - also nicht das Element selber zurück bekomme, sondern die Information "Das Element mit dem zehntgrößten score-Wert befindet sich an Position 75 in der Liste".
Mein erster naiver Ansatz wäre einfach die Liste nach den score-Werten zu sortieren und damit schon mal das zehnt-größte Element zu finden. Nur ist es dann ja nicht mehr dort, wo es ursprünglich war. Kann ich von den Elementen in der sortierten Liste irgendwie möglichst direkt auf die ursprüngliche Listenposition schließen oder muss ich ne Kopie der Liste machen, diese sortieren und dann nochmal die Original-Liste durchgehen um das Element zu finden (was mir ziemlich aufwendig erscheint? Oder gibt es vielelicht noch einen ganz anderen, eleganteren Weg das Problem zu lösen?
BlackJack

@AllesMeins: Sortierte Liste mit Tupeln aus Score und Index erstellen, das n-te Tupel davon nehmen und den Index daraus lesen (ungetestet):

Code: Alles auswählen

def get_index_of_nth_least_scored_dictionary(n, dictionaries):
    return sorted((d['score'], i) for i, d in enumerate(dictionaries))[n][1]
AllesMeins
User
Beiträge: 63
Registriert: Donnerstag 20. November 2003, 13:45
Wohnort: Frankfurt/M.

Ja, das sieht gut aus... Danke!
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Kommt gar nicht so selten vor, dass es von Vorteil wäre, wenn die Elemente eines dicts sortiert wären. Hab meinen PEP aber noch nicht geschrieben.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Du meinst sowas? http://docs.python.org/library/collecti ... rderedDict

Im vorliegenden Fall aber nunmal ueberhaupt nicht hilfreich, weil es nicht um ein Dictionary geht sondern um eine Liste.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

cofi hat geschrieben:Du meinst sowas? http://docs.python.org/library/collecti ... rderedDict
Cool. Ab 2.7. Dann kann ich mir den PEP sparen. Wobei ich es noch cooler fände, wenn man dafür nicht etwa collections importieren müsste. Ich glaube, da liese sich einiges vereinfachen.
cofi hat geschrieben:Im vorliegenden Fall aber nunmal ueberhaupt nicht hilfreich, weil es nicht um ein Dictionary geht sondern um eine Liste.
EDIT: OK. Ich habe den OP post noch mal genau gelesen. Wäre in dem Fall nicht so hilfreich.
BlackJack

@hendrikS: Ist es wirklich *das* was Du haben wolltest? Du hast doch "sortiert" geschrieben und in einem anderen Thread die C++-Container erwähnt. Das `collections.OrderedDict` ist nicht wirklich sortiert -- die Schlüssel müssen keine totale Ordnung aufweisen. Du kannst da zum Beispiel auch komplexe Zahlen als Schlüssel nehmen -- die sind nicht einmal auf kleiner oder grösser vergleichbar. Das `OderedDict` nützt dem OP also nichts.

Bevor Du ein PEP schreibst, solltest Du die alten Diskussionen zu dem Thema suchen. Es kamen zumindest früher immer regelmässig Leute in comp.lang.python an und wollten ein "sortiertes Dictionary" in der Standardbibliothek. Was dagegen sprach, war 1. das in der darauf üblicherweise folgenden Diskussion jeder andere Erwartungen an die Grundoperationen hatte und 2. man sich die Variante, die man gerne hätte, ziemlich einfach selbst implementieren kann.

Als Grunddatentyp sehe ich das jedenfalls nicht. Statt eines PEPs wäre Deine Zeit also vielleicht besser genutzt, wenn Du einfach das was Du haben möchtest, implementierst. *Dann* kannst Du ein PEP schreiben, dass das in die Standardbibliothek aufgenommen werden könnte.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

BlackJack hat geschrieben:@hendrikS: Ist es wirklich *das* was Du haben wolltest?
Ach herje irgendie wieder nur oberflächlich gelesen. :oops: Echt gut, daß Du aufmerksam bist.

Ich finde komisch, daß es daran gescheitert ist, weil man sich nicht einigen konnte. Eine funktionell ähnliche Implementierung der, in der C++ STL fände ich nicht schlecht. Das ist dort schon gut gemacht.
Selbst implementieren? Müßte mir erst mal überlegen wie man ein Dict implementiert. So adhoc erst mal nicht so einfach. Vielleicht werde in dem anderen Thread erst noch ein paar Vorschläge einstellen und zur Diskussion anregen.
Antworten