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?
Liste aus Dicts - Position des n-größten Elementes finden
-
- User
- Beiträge: 63
- Registriert: Donnerstag 20. November 2003, 13:45
- Wohnort: Frankfurt/M.
@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]
-
- User
- Beiträge: 63
- Registriert: Donnerstag 20. November 2003, 13:45
- Wohnort: Frankfurt/M.
Ja, das sieht gut aus... Danke!
- 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.
Im vorliegenden Fall aber nunmal ueberhaupt nicht hilfreich, weil es nicht um ein Dictionary geht sondern um eine Liste.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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:Du meinst sowas? http://docs.python.org/library/collecti ... rderedDict
EDIT: OK. Ich habe den OP post noch mal genau gelesen. Wäre in dem Fall nicht so hilfreich.cofi hat geschrieben:Im vorliegenden Fall aber nunmal ueberhaupt nicht hilfreich, weil es nicht um ein Dictionary geht sondern um eine Liste.
@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.
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.
Ach herje irgendie wieder nur oberflächlich gelesen. Echt gut, daß Du aufmerksam bist.BlackJack hat geschrieben:@hendrikS: Ist es wirklich *das* was Du haben wolltest?
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.