2013-05-07 18 views
11

ho un dict (che è anche una chiave di un dict più grande) di dicts che assomigliaPython: l'ordinamento dizionario di dizionari

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

voglio ordinare le parole chiave (al più alto livello) di il corrispondente valore 'Fisher' ... modo che l'uscita assomiglia

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

ho provato a lavorare con gli oggetti() e ordinati(), ma non riesco a lavorare fuori ... Please help me out :(

+4

Purtroppo si può ordinare un dizionario, è ordinata. Leggi questo ottimo post per i suggerimenti su come farlo: http://stackoverflow.com/questions/613183/python-sort-a-dictionary-by-value –

risposta

24

Non è possibile ordinare un dett, ma è possibile ottenere un elenco ordinato di chiavi, valori o coppie (chiave, valori).

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

o creare un collections.OrderedDict (introdotte in Python 2.7) dopo aver ottenuto l'ordinata (chiave, valore) coppie:

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

Per il vostro dizionario, provate questo:

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

Nota che ['OrderedDict'] (http: // docs. python.org/2/library/collections.html?highlight=ordereddict#ordereddict-examples-and-recipes) è solo per le versioni di Python 2.7 e successive. –

+0

utilizzando items() restituisce KeyError ... perché potrebbe essere? – ytrewq

+0

@CosmicRabbitMediaInc Uno dei tuoi dizionari potrebbe non avere la chiave 'Fisher', è corretta? Prova 'all ('Fisher' in d [k] per k in d)' e invia l'output – jamylak

3

Se hai solo bisogno delle chiavi in ​​ordine, puoi ottenere una lista come questa

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

se 'Fisher' potrebbe mancare, è possibile utilizzare questo per spostare le voci ultimi

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

o '-inf' per metterli all'inizio

Problemi correlati