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'
чтобы разместить их в начале