2013-05-27 10 views
52

Si supponga di avere un dett.ordinamento dettato dal valore python

data = {1:'b', 2:'a'} 

E voglio ordinare i dati da 'b' e 'un' in modo da ottenere il risultato

'a','b' 

Come posso fare?
Qualche idea?

+5

possibile duplicato di [ordinamento dei valori del dizionario Python] (http: //stackoverflow.com/questions/6046049/python-dictionary-values-sorting) –

+0

possibile duplicato di [Come ordinare i dizionari per le chiavi in ​​Python] (http://stackoverflow.com/questions/4642501/how-to-sort -dictionaries-by-keys-in-python) – njzk2

+2

possibile duplicato di http://stackoverflow.com/questions/613183/python-sort-a-dictionary-by-value Dai un'occhiata a questo: http: // stackoverflow. it/questions/613183/python-sort-a-dictionary-by-value/4215710 # 4215710 – jimifiki

risposta

127

per ottenere i valori utilizzano

sorted(data.values()) 

per ottenere le chiavi di corrispondenza, utilizzare una funzione

sorted(data, key=data.get) 

key Per ottenere una lista di tuple ordinate per valore

sorted(data.items(), key=lambda x:x[1]) 

correlati : vedi la discussione qui: Dictionaries are ordered in Python 3.6+

+0

Ok, scusa. Quello che intendevo era ottenere (2: 'a', 1: 'b') ... qualche idea? – kingRauk

+1

@kingRauk, le dict non sono ordinate, ma è possibile creare un elenco ordinato di tuple –

+0

ordinato (data.items(), chiave = lambda x: x [1], inverso = True) per ordine riverito – Mannu

7

ordinare i valori:

sorted(data.values()) 

rendimenti

['a','b'] 
4

Penso anche che è importante notare che Python dict tipo di oggetto è una tabella di hash (more on this here), e quindi non è in grado di essere ordinato senza convertire le sue chiavi/valori in liste. Ciò che ciò consente è il recupero degli articoli in dict in tempo costante O(1), indipendentemente dalla dimensione/numero di elementi in un dizionario.

Detto questo, una volta che si ordinano le sue chiavi - sorted(data.keys()), o valori - sorted(data.values()), è quindi possibile utilizzare tale elenco per accedere alle chiavi/valori nei modelli di design come questi:

for sortedKey in sorted(dictionary): 
    print dictionary[sortedKeY] # gives the values sorted by key 

for sortedValue in sorted(dictionary.values()): 
    print sortedValue # gives the values sorted by value 

Spero che questo aiuti.

+3

'ordinato (dizionario)' è meglio di 'sorted (dictionary.keys())' – jamylak

+0

@jamylak grazie per il suggerimento, ma mi chiedo se si comporti in un modello diverso da quello che farebbe '.keys()'? –

+1

È semanticamente equivalente ma più veloce e più idiomatico – jamylak

29

Se effettivamente desidera ordinare il dizionario invece di ottenere utilizzare un elenco ordinato collections.OrderedDict

>>> from collections import OrderedDict 
>>> from operator import itemgetter 
>>> data = {1: 'b', 2: 'a'} 
>>> d = OrderedDict(sorted(data.items(), key=itemgetter(1))) 
>>> d 
OrderedDict([(2, 'a'), (1, 'b')]) 
>>> d.values() 
['a', 'b'] 
+0

La cosa triste è che è in Python 2.6.5 ... che non supporta OrderedDict – kingRauk

+5

@kingRauk quindi non tagga la tua domanda Python 2.7 .... Anche un sacco di cose hai menzionato nei commenti avrebbe dovuto essere nella tua domanda per iniziare con – jamylak

+0

Sì, mi dispiace per quello ... – kingRauk

14

Dal tuo commento gnibbler risposta, direi che si desidera un elenco di coppie di valore-chiave ordinato per valore:

sorted(data.items(), key=lambda x:x[1]) 
6

Grazie per tutte le risposte. Siete tutti miei eroi ;-)

Forse, alla fine, qualcosa di simile:

d = sorted(data, key = d.get) 

for id in d: 
    text = data[id] 
1

Nel tuo commento in risposta a John, suggerisci che si desidera le chiavi ei valori del dizionario, non solo i valori.

PEP 256 suggerisce questo per ordinare un dizionario per valori.

import operator 
sorted(d.iteritems(), key=operator.itemgetter(1)) 

se volete l'ordine decrescente, fare questo elenco

sorted(d.iteritems(), key=itemgetter(1), reverse=True) 
0

nessun metodo lambda

# sort dictionary by value 
d = {'a1': 'fsdfds', 'g5': 'aa3432ff', 'ca':'zz23432'} 
def getkeybyvalue(d,i): 
    for k, v in d.items(): 
     if v == i: 
      return (k) 

sortvaluelist = sorted(d.values()) 
sortresult ={} 
for i1 in sortvaluelist: 
    key = getkeybyvalue(d,i1) 
    sortresult[key] = i1 
print ('=====sort by value=====') 
print (sortresult) 
print ('=======================') 
0

Si potrebbe precedentemente creati ordinato dai valori e ricostruire il dizionario:

myDictionary={"two":"2", "one":"1", "five":"5", "1four":"4"} 

newDictionary={} 

sortedList=sorted(myDictionary.values()) 

for sortedKey in sortedList: 
    for key, value in myDictionary.items(): 
     if value==sortedKey: 
      newDictionary[key]=value 

Output: newDict ionary = {'one': '1', 'two': '2', '1four': '4', 'five': '5'}

Problemi correlati