/ / Python - So sortieren Sie ein Wörterbuch nach seinem Wert sowie nach dem Schlüssel - Python, Wörterbuch, Tupel

Python - Wie man ein Wörterbuch basierend auf seinem Wert sowie Schlüssel - Python, Wörterbuch, Tupel zu sortieren

Ich habe ein Wörterbuch als: -

{
(1, 1): 16,
(1, 2): 16,
(1, 3): 16,
(1, 4): 16,
(2, 1): 24,
(2, 2): 24,
(2, 3): 24,
(2, 4): 24   }

... Ich möchte, dass es nach dem zweiten Feld des Tupel-Schlüssels sowie dem Wertefeld des Wörterbuchs bestellt wird. Das Ergebniswörterbuch sollte also folgendermaßen lauten: -

{
(2, 1): 24,
(2, 2): 24,
(2, 3): 24,
(2, 4): 24,
(1, 1): 16,
(1, 2): 16,
(1, 3): 16,
(1, 4): 16
}

... Ich habe versucht, es mit Wert allein zu sortieren, aber es bringt die Tasten-Tupel-Reihenfolge durcheinander.

list = sorted(unsorted_dict, key = unsorted_dict.__getitem__, reverse=True)....

Tut mir leid zu sagen, aber antworte auf meine Situation teilweise ...

Ich möchte nicht den ersten Wert für das Sortieren berücksichtigen.

{
(5, 1): 16,
(6, 2): 16,
(7, 3): 16,
(8, 4): 16,
(4, 1): 24,
(3, 2): 24,
(2, 3): 24,
(1, 4): 24   }

und ich wollte Ausgabe ...

{
(4, 1): 24,
(3, 2): 24,
(2, 3): 24,
(1, 4): 24,
(5, 1): 16,
(6, 2): 16,
(7, 3): 16,
(8, 4): 16        }

.... wie gesagt ich möchte Tupel betrachten zweite Wert für die Sortierung und überhaupt nicht den ersten Wert für die Sortierung in Betracht ziehen ... Es wäre auch eine große Hilfe, wenn jemand sagen kann .. wie extrahiere ich die Tupel aus diesem sortierten Wörterbuch in eine Liste wie ..

(4, 1), (3, 2), (2, 3), (1, 4), (5, 1), (6, 2), (7, 3), (8, 4)

BEARBEITEN: so half der Kommentar, was ich wollte ... vielen Dank ...

list_sorted = sorted(unsorted_dict.items(),key=lambda x: (-x[1],x[0][1]))
for val in list_sorted:
final_list.append(val[0])

korrigiert die Schlüssel-Wert-Paare danke @Padraic Cunningham für den Hinweis

Antworten:

3 für die Antwort № 1

dicts keine Bestellung haben, können Sie die Artikel sortieren:

d={
(1, 1): 16,
(1, 2): 16,
(1, 3): 16,
(1, 4): 16,
(2, 1): 24,
(2, 2): 24,
(2, 3): 24,
(2, 4): 24   }

from pprint import pprint as pp

pp(sorted(d.items(),key=lambda x: (-x[1],x[0])))
[((2, 1), 24),
((2, 2), 24),
((2, 3), 24),
((2, 4), 24),
((1, 1), 16),
((1, 2), 16),
((1, 3), 16),
((1, 4), 16)]

Und wenn Sie wirklich ein Diktat mit den Elementen in der richtigen Reihenfolge wünschen, können Sie ein Collections.OrderedDict von den sortierten Artikeln:

from collections import OrderedDict

od = OrderedDict(sorted(d.items(),key=lambda x: (-x[1],x[0])))
OrderedDict([((2, 1), 24), ((2, 2), 24), ((2, 3), 24), ((2, 4), 24), ((1, 1), 16), ((1, 2), 16), ((1, 3), 16), ((1, 4), 16)])

Unser primärer Sortierschlüssel ist jeder Wert, der von hoch nach niedrig sortiert wird, indem jeder Wert mit a negiert wird -, dann brechen wir die Bindung mit der Key / Tupel-Sortierung von niedrig nach hoch.

Bindungen nach zweitem Element im Tupel brechen:

pp(sorted(d.items(),key=lambda x:(-x[1],x[0][1])))

Ihre bearbeitete Ausgabe verfügt jetzt über verschiedene Schlüssel mit unterschiedlichen Werten.