Python: сортировочный словарь словарей

У меня есть dict (который также является ключом большего dict) dicts, который выглядит как

wd[wc][dist][True]={'course': {'#': 1, 'Fisher': 4.0},
 'i': {'#': 1, 'Fisher': -0.2222222222222222},
 'of': {'#': 1, 'Fisher': 2.0},
 'will': {'#': 1, 'Fisher': 3.5}}

Я хочу отсортировать ключевые слова (на самом высоком уровне) по их соответствующему значению "Fisher"... так, чтобы результат выглядел

wd[wc][dist][True]={'course': {'Fisher': 4.0, '#': 1}, 'will': {'Fisher': 3.5, '#': 1}, 'of': {'Fisher': 2.0, '#': 1}, 'i': {'Fisher': -0.2222222222222222, '#': 1}}

Я пробовал работать с items() и сортировал(), но не могу это обработать... Пожалуйста, помогите мне :(

Ответ 1

Вы не можете сортировать dict, но можете получить отсортированный список ключей, значений или (ключ, значения).

>>> dic = {'i': {'Fisher': -0.2222222222222222, '#': 1}, 'of': {'Fisher': 2.0, '#': 1}, 'will': {'Fisher': 3.5, '#': 1}, 'course': {'Fisher': 4.0, '#': 1}}

>>> sorted(dic.items(), key=lambda x: x[1]['Fisher'], reverse=True)
[('course', {'Fisher': 4.0, '#': 1}),
 ('will', {'Fisher': 3.5, '#': 1}),
 ('of', {'Fisher': 2.0, '#': 1}),
 ('i', {'Fisher': -0.2222222222222222, '#': 1})
]

Или создайте collections.OrderedDict (введенные в Python 2.7) после получения отсортированных (ключ, значение) пар:

>>> from collections import OrderedDict
>>> od = OrderedDict(sorted(dic.items(), key=lambda x: x[1]['Fisher'], reverse=True))
>>> od
OrderedDict([
('course', {'Fisher': 4.0, '#': 1}),
('will', {'Fisher': 3.5, '#': 1}),
('of', {'Fisher': 2.0, '#': 1}),
('i', {'Fisher': -0.2222222222222222, '#': 1})
])

Для вашего словаря попробуйте следующее:

>>> from collections import OrderedDict
>>> dic = wd[wc][dist][True]
>>> wd[wc][dist][True]= OrderedDict(sorted(dic.items(), key=lambda x: x[1]['Fisher'], reverse=True))

Ответ 2

Если вам просто нужны клавиши в порядке, вы можете получить список, подобный этому

dic = {'i': {'Fisher': -0.2222222222222222, '#': 1}, 'of': {'Fisher': 2.0, '#': 1}, 'will': {'Fisher': 3.5, '#': 1}, 'course': {'Fisher': 4.0, '#': 1}}
sorted(dic, key=lambda k: dic[k]['Fisher'])

если "Fisher" может отсутствовать, вы можете использовать его для перемещения последних записей

sorted(dic, key=lambda x:dic[x].get('Fisher', float('inf')))

или '-inf' чтобы разместить их в начале