Seite 1 von 1

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

Verfasst: Donnerstag 3. März 2011, 15:15
von AllesMeins
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?

Re: Liste aus Dicts - Position des n-größten Elementes finde

Verfasst: Donnerstag 3. März 2011, 15:24
von 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]

Re: Liste aus Dicts - Position des n-größten Elementes finde

Verfasst: Donnerstag 3. März 2011, 16:23
von AllesMeins
Ja, das sieht gut aus... Danke!

Re: Liste aus Dicts - Position des n-größten Elementes finde

Verfasst: Donnerstag 3. März 2011, 18:32
von hendrikS
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.

Re: Liste aus Dicts - Position des n-größten Elementes finde

Verfasst: Donnerstag 3. März 2011, 18:42
von cofi
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.

Re: Liste aus Dicts - Position des n-größten Elementes finde

Verfasst: Donnerstag 3. März 2011, 18:49
von hendrikS
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.

Re: Liste aus Dicts - Position des n-größten Elementes finde

Verfasst: Donnerstag 3. März 2011, 19:18
von 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.

Re: Liste aus Dicts - Position des n-größten Elementes finde

Verfasst: Donnerstag 3. März 2011, 21:47
von hendrikS
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.