2013-05-07 13 views
11

Mam dict (co jest również kluczowym większego dict) od dicts że wyglądaPython: Sortowanie słownika słowników

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

Chcę uporządkować słowa kluczowe (na najwyższym szczeblu) przez ich odpowiednia wartość "Fishera ... tak, że wyjście wygląda

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

próbowałem pracować z elementów() i sortowane(), ale nie mogą się dogadać ... Proszę mi pomóc obecnie: (

+4

Niestety nie można sortować słownika, to nieuporządkowana. Przeczytaj ten świetny post na temat wskazówek, jak to zrobić: http://stackoverflow.com/questions/613183/python-sort-a-dictionary-by-value –

Odpowiedz

24

Nie można sortować dyktowania, ale można uzyskać posortowaną listę kluczy, wartości lub par (klucza, wartości).

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

lub załóż collections.OrderedDict (wprowadzone w Pythonie 2.7) po otrzymaniu sortowane (klucz, wartość) pary:

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

Dla słownika, spróbuj tego:

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

Zwróć uwagę, że ['OrderedDict'] (http: // docs. python.org/2/library/collections.html?highlight=ordereddict#ordereddict-examples-and-recipes) jest tylko dla wersji Pythona 2.7 i nowszych. –

+0

używanie items() skutkuje KeyError ... dlaczego to możliwe? – ytrewq

+0

@CosmicRabbitMediaInc Jeden ze słowników może nie mieć klawisza 'Fisher', czy to prawda? Wypróbuj 'all ('Fisher' w d [k] dla k in d)' i post output – jamylak

3

Jeśli po prostu potrzebujesz kluczy w kolejności, możesz uzyskać listę taką jak ta

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

jeśli „Fisher” może brakować, można to wykorzystać, aby przenieść te wpisy ostatnich

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

lub '-inf', aby umieścić je na początku

Powiązane problemy