2016-05-30 6 views
-1

Ich habe ein Array von dict-Objekten, die ich basierend auf mehreren Regeln bestellen sollte.Dict-Objekte basierend auf mehreren Schlüsselwerten und Vergleichsregeln sortieren

Dies ist, wie die Probe dicts wie folgt aussieht:

dict1 = {'key1': '85', 'key2': '163', 'key3': '3'} 
dict2 = {'key1': '3', 'key2': '23', 'key3': '1'} 
dict3 = {'key1': '88', 'key2': '153', 'key3': '6'} 

Und diese Regeln sollten für die Bestellung folgen:

key1 - the higher value is the better 
key2 - the higher value is the better 
key3 - the lower value is the better 

So nach dem meiner Liste Bestellung so sein sollte:

dict_list = [dict1, dict3, dict2] 

#dict1 is the first obj, because it has the biggest key1 + key2 value and the 2. lowest key3 value 

dict_list Objekte nach Wert (gewünschtes Ergebnis):

# value name - high values (key1 + key2) - low values (key3) 
1. dict1     248      3 
2. dict3     241      6 
3. dict2     26      1 

Von key1 und key2 Ich konnte eine absolute Zahl für den Vergleich, schaffen aber leider kann ich es nicht tun, weil key3 noch da sein würde, und ich kann nicht die gleiche Logik für sie verwenden.

Also meine Frage: ist es möglich, meine eigenen Regeln für die Bestellung zu definieren? Gibt es eine Python-Funktion für solche Aufgaben?

+0

Was machen Sie, wenn Sie {key1: 2, key3: 1} und {key1: 1, key3: 2} haben? –

+0

Sie können Ihre eigene Bestellung mit einer Schlüsselfunktion definieren. Siehe https://wiki.python.org/moin/HowTo/Sorting – pvg

Antwort

2

Wenn ich richtig verstanden habe, möchten Sie Schlüssel 1 und Schlüssel 2 hinzufügen und Schlüssel 3 subtrahieren und sie auf dieser Zahl von hoch zu niedrig bestellen? Wenn ja, dies tun:

list_dicts = sorted(list_dicts, key=lambda x:int(x['key3'])-int(x['key2'])-int(x['key1'])) 

Was das bedeutet ist Ihre Werte auf ganze Zahlen Karte und die Werte der Taste 1 und Taste 2 aus dem Wert des Schlüssel 3 abziehen, weil es sie von niedrig bis hoch bestellt. Es wird Ihre ursprünglichen Wörterbücher behalten, nur in der gewünschten Reihenfolge.

Verwandte Themen