Решение
Используется collections.OrderedDict
.
Краткий ответ
Вы можете использовать следующие функции и использовать OrderedDict
.
from collections import OrderedDict
d = {34: "martsz", 79: "David", "": "Kathy", 63: "Daniel"}
d = OrderedDict(**d)
get_sorted_dict(d, target_key='')
Вывод :
OrderedDict([('34', 'martsz'),
('63', 'Daniel'),
('', 'Kathy'),
('79', 'David')])
Длинный ответ
Сюда входят пользовательские функции.
from collections import OrderedDict
def get_sorted_keys(keys, target_key='') -> list:
"""Returns a list of sorted keys with
index of target_key kept unchanged.
"""
keys = [str(k) for k in keys]
sorted_keys = sorted(keys)
sorted_keys.pop(sorted_keys.index(''))
target_key_index = keys.index(target_key)
sorted_keys.insert(target_key_index, target_key)
return sorted_keys
def get_sorted_dict(d:dict, target_key='') -> OrderedDict:
"""Returns a dictionary sorted by the keys, while
keeping the index of the target_key unchanged.
"""
sorted_keys = get_sorted_keys(keys = d.keys(),
target_key = target_key)
sorted_dict = OrderedDict()
for k in sorted_keys:
temp = {k: d.get(int(k))} if not (k==target_key) else {k: d.get(k)}
sorted_dict.update(temp.copy())
return sorted_dict
##----------------- Implementation ------------------
d = {34: "martsz", 79: "David", "": "Kathy", 63: "Daniel"}
d = OrderedDict(**d)
get_sorted_dict(d, target_key='')