2013-05-07 7 views
11

у меня есть Dict (который также является ключом большего Словаре) из dicts, который выглядит какPython: Сортировка словаря словарей

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}} 

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

+4

К сожалению, вы не можете сортировать словарь, это неупорядоченный. Прочитайте это замечательное сообщение для указателей о том, как это сделать: http://stackoverflow.com/questions/613183/python-sort-a-dictionary-by-value –

ответ

24

Вы не можете сортировать 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)) 
+1

Обратите внимание, что ['OrderedDict'] (http: // docs. python.org/2/library/collections.html?highlight=ordereddict#ordereddict-examples-and-recipes) предназначен только для версий Python версии 2.7 и выше. –

+0

с помощью элементов() результатов в KeyError ... почему это может быть? – ytrewq

+0

@CosmicRabbitMediaInc Один из ваших словарей может не иметь ключа 'Fisher', это правильно? Попробуйте 'all ('Fisher' в d [k] для k в d)' и пост-вывод – jamylak

3

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

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']) 

если «Фишер» может отсутствовать, вы можете использовать это, чтобы переместить эти записи последних

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

или '-inf' поместить их в начале

Смежные вопросы