2013-12-13 57 views
22

Desidero ordinare questo dizionario basato sul valore della chiave secondaria key3 in ordine decrescente. Vedi sotto:dizionario python ordinamento in ordine decrescente in base ai valori

d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 }, 
     '124': { 'key1': 6, 'key2': 56, 'key3': 6 }, 
     '125': { 'key1': 7, 'key2': 44, 'key3': 9 }, 
    } 

Quindi il dizionario finale sarebbe simile a questo.

d = { '125': { 'key1': 7, 'key2': 44, 'key3': 9 }, 
     '124': { 'key1': 6, 'key2': 56, 'key3': 6 }, 
     '123': { 'key1': 3, 'key2': 11, 'key3': 3 }, 
    } 

Il mio approccio è stato quello di formare un altro e dizionario da D, la cui chiave sarebbe il valore di key3 e quindi utilizzare invertita (ordinate (e)), ma dal momento che il valore di key3 può essere lo stesso, in modo da dizionario e perso un po 'di le chiavi e i loro valori. ha senso?

Come posso realizzare questo? Questo non è un codice testato. Sto solo cercando di capire la logica.

+1

Per riferimento futuro, ricordate che '' dict'' (s) in quasi tutte le lingue sono intrinsecamente sottoposti a cernita di definizione. La maggior parte dei tipi di dati di mappatura chiave/valore sono. Si prega di accettare o abarnert o ohn Zwinck's risposta (s). –

risposta

36

Dictionaries do not have any inherent order. O, piuttosto, il loro ordine intrinseco è "arbitrario ma non casuale", quindi non ti fa bene.

In termini diversi, il tuo d e il tuo e sarebbero esattamente dizionari equivalenti.

Cosa si può fare qui è quello di utilizzare un OrderedDict:

from collections import OrderedDict 
d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 }, 
     '124': { 'key1': 6, 'key2': 56, 'key3': 6 }, 
     '125': { 'key1': 7, 'key2': 44, 'key3': 9 }, 
    } 
d_ascending = OrderedDict(sorted(d.items(), key=lambda kv: kv[1]['key3'])) 
d_descending = OrderedDict(sorted(d.items(), 
            key=lambda kv: kv[1]['key3'], reverse=True)) 

L'originale d ha qualche ordine arbitrario. d_ascending ha l'ordine pensato che avevi nel tuo d originale, ma non lo fece. E d_ascending ha l'ordine che desideri per il tuo e.


Se non si ha realmente bisogno di utilizzare e come un dizionario, si vuole solo essere in grado di iterare gli elementi di d in un ordine particolare, è possibile semplificare questo:

for key, value in sorted(d.items(), key=lambda kv: kv[1]['key3'], reverse=True): 
    do_something_with(key, value) 

Se si desidera mantenere un dizionario in ordine per tutte le modifiche, invece di un OrderedDict, si desidera un dizionario ordinato. Esistono diverse opzioni disponibili su PyPI, alcune implementate in cima ad alberi, altre su uno OrderedDict che ri-ordina se necessario, ecc.

4

è possibile utilizzare il codice riportato di seguito per l'ordinamento in ordine decrescente e la memorizzazione di un dizionario:

 listname = [] 
     for key, value in sorted(dictionaryName.iteritems(), key=lambda (k,v): (v,k),reverse=True): 
      diction= {"value":value, "key":key} 
      listname.append(diction) 
2

Lista

dict = {'Neetu':22,'Shiny':21,'Poonam':23} 
print sorted(dict.items()) 
sv = sorted(dict.values()) 
print sv 

dizionario

d = [] 
l = len(sv) 
while l != 0 : 
    d.append(sv[l - 1]) 
    l = l - 1 
print d` 
17

Una breve esame Ple per ordinare dizionario è desending ordine

a1 = {'a':1, 'b':13, 'd':4, 'c':2, 'e':30} 
a1_sorted_keys = sorted(a1, key=a1.get, reverse=True) 
for r in a1_sorted_keys: 
    print r, a1[r] 

In seguito sarà l'uscita

e 30 
b 13 
d 4 
c 2 
a 1 
Problemi correlati