Hallo unixmelo,
ich verstehe noch nicht genau, welche Daten Du bekommst. Du sprichst von einer Liste der Programmiersprachen, gibst aber ein dict
an. Je nachdem was Du machen musst, ändert sich aber die Lösung.
Wie bereits von _marc geschrieben, ist die Schwierigkeit, dass die dict
s in Python nur mit O(1) einen Wert zum Schlüssel ausgeben können, aber dafür bei der Ausgabe seit Python 3.7 nach Einfügenordnung ausgeben (davor war dies eine zufällige Reihenfolge).
Falls Du wirklich mit einem dict
startest und ein sortiertes dict
benötigst, sehe ich folgende Ansätze:
Counter oder ValueSortedDict
Wenn Du Funktionen, welche in Python implementiert sind, nutzen darfst, solltest Du mal den Counter()
aus dem Modul collections
mit seiner eingebauten Funktion most_common()
aus der Python-Dokumentation nachschlagen. Ein Counter
ist nur ein spezielles dict
, ich gehe aber davon aus, dass bei der Umwandlung die Speicheradresse unter der das Objekt gespeichert wird, sich ändert, von daher ist das nicht wirklich in-place. Das Modul ist in der Standard Library.
Noch klarer wäre ein ValueSortedDict
aus dem Modul sortedcollections
, welches man aber über pip install sortedcollections
installieren müsste. Da sehe ich aber prinzipiell auch die Frage nach dem in-place Eigenschaften.
Eigene Funktion die dict
modifiziert
Mit dem Wissen, dass ein dict
in Python seine Einfügeordnung behält, und Du das dict
in-place sortieren sollst, kann ich mir nur das Arbeiten mit del
und gezieltes Einfügen vorstellen. Dabei könnte man dann einen Schlüssel mitdel L['Python']
erst löschen und dann mit L['Python'] = 3
wieder anlegen.
Das entspricht meines Erachtens aber dann nicht mehr wirklich Insertion-Sort, sondern eher Selection-Sort.
Umweg über Liste
Alle bisher vorgeschlagenen Wege gehen ja den Umweg über eine Liste, da man dort überhaupt erst sinnvoll Insertion-sort implementieren kann, dann ist dort zwar das Sortieren in-place, aber wegen der neuen Hilfsliste wird ja trotzdem anderen Speicherplatz benötigt.
D.h. Du startest mit L = {key0: value0, ...}
einem dict
, gehst zu L = [(value0, key0), ... (valuen, keyn)]
einer Liste, dann folgt in-place Dein Insertion-Sort, der die Liste modfiziert zu L = [(valuen, keyn), ..., (value0, key0)]
und du gehst wieder zum dict
über. Die Wechsel lassen sich alle über die sogennten Comprehension machen, z.B. L = [(value, key) for key, value in L.items()]
um vom dict
L zur list
L zu wechseln bzw. L = {key: value for key, value in L]
um von der list
zum dict
zu wechseln. Dazwischen muss man natürlich L
in-place sortiert haben.