Frage an die Mathematiker

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

Hi,

ich möchte einen etwas anderen Weg gehen, um die Zeilen einer Tabelle zu füllen. Und zwar berechne ich den Anteil der einzelnen Zellen an der gesamten Tabellenbreite aufrund von zugeteilten Hierarchiestufen.

Dabei gelten folgende Regeln:

- die Stufen sind eine beliebige Folge von ganzen Zahlen
- ein Objekt der nächsthöheren Stufe darf nie kleiner sein als das Objekt mit der niedrigeren Stufe
- am Ende muss die komplette Tabellenbreite (100%) gefüllt sein

Zunächst ermittle ich von einer Liste mit "Stufenobjekten" in beliebiger Reihenfolge die Hierarchie:

Code: Alles auswählen

In [1]: def get_hierarchy(items):
   ...:     return sorted(((item, items.count(item)) for item in set(items)), reverse=True)
   ...: 

In [2]: get_hierarchy([1,4,4,5,6,3,4,2,1,1,3])
Out[2]: [(6, 1), (5, 1), (4, 3), (3, 2), (2, 1), (1, 3)]
D.h.: Stufe 6 kommt einmal vor, Stufe 5 auch einmal, Stufe 4 dreimal usw.

Und jetzt war mein Gedanke, pro Stufe die gesamte (restliche) Tabellenbreite durch die Anzahl der Vorkommnisse + 1 zu rechnen. Der gefundene Anteil wird der Stufe in einem Dictionary zugeschrieben und das zusätzliche Vorkommniss ist der Rest für die übrigen Stufen. Also:

Code: Alles auswählen

In [3]: width = 100.0

In [4]: relations = {}

In [5]: for level, occurrance in [(6, 1), (5, 1), (4, 3), (3, 2), (2, 1), (1, 3)]:
   ...:     width /= occurrance + 1
   ...:     relations[level] = width
   ...:     
   ...:     

In [6]: relations
Out[6]: 
{1: 0.26041666666666669,
 2: 1.0416666666666667,
 3: 2.0833333333333335,
 4: 6.25,
 5: 25.0,
 6: 50.0}
Rechnet man das Ganze wieder zurück (also die jeweiligen Werte mit den Vorkommnissen für die Stufe multiplizieren), so kommt man auch annähernd auf 100%. Meine Frage nun: Kann man das noch effizienter gestalten (irgendwelche speziellen Mathe-Builtins oder andere Rechenschritte benutzen) oder ist das so für eine spätere Funktion okay?

Eigentlich möchte ich halt auch meine eigenen Mathezellen trimmen und Python in dieser Hinsicht besser kennenlernen, da ich diesen Bereich bisher eher gemieden habe. Falls es also Verbesserungsvorschläge gibt, dann her damit. ;)
Antworten