Come John Machlin ha detto che non puoi effettivamente ordinare un dizionario Python.
Tuttavia, è possibile creare un indice delle chiavi che possono essere ordinate nell'ordine desiderato.
Il pattern Python preferito (idioma) per l'ordinamento da qualsiasi criterio alternativo è chiamato "decorare-ordinamento-undecorate" (DSU). In questo idioma crei un elenco temporaneo che contiene tuple delle tue chiavi seguite dagli elementi di dati originali, quindi chiama il normale metodo .sort() in tale elenco (o, nelle versioni più recenti di Python, semplicemente avvolgi il tuo decorazione in un chiamato alla funzione integrata ordinata()). Quindi rimuovi le "decorazioni".
Il motivo di questo è generalmente preferiti passando funzione di confronto alla .Sort() metodo è che di Python incorporata codice ordinamento predefinito (compilato C nel normale C Python) è molto veloce ed efficiente nel caso di default , ma molto, molto più lentamente quando deve chiamare il codice oggetto Python molte, molte volte nel caso non predefinito. Quindi di solito è molto meglio iterare sui dati che creano strutture di dati che possono essere passate alle routine di ordinamento predefinite.
In questo caso si dovrebbe essere in grado di usare qualcosa come:
[y[1] for y in sorted([(myDict[x][2], x) for x in myDict.keys()])]
... che è una lista di comprensione facendo l'undecorate dalla lista ordinata di tuple che viene restituito dalla lista di comprensione interiore. La comprensione interiore sta creando una serie di tuple, la chiave di ordinamento desiderata (il terzo elemento della lista) e la chiave del dizionario corrispondente alla chiave di ordinamento. myDict.keys() è, ovviamente, un metodo di dizionari Python che restituisce un elenco di tutte le chiavi valide in qualsiasi ordine che l'implementazione sottostante sceglie --- presumibilmente una semplice iterazione sugli hash.
Un modo più dettagliato di fare questo potrebbe essere più facile da leggere:
temp = list()
for k, v in myDict.items():
temp.append((v[2],))
temp.sort()
results = list()
for i in temp:
results.append(i[1])
Di solito si dovrebbe costruito tale codice in modo iterativo, l'interprete utilizzando piccoli campioni di dati. Costruisci l'espressione o la funzione "decorare". Quindi avvolgere quello in una chiamata a ordinato(). Quindi costruisci l'espressione non decorata (che di solito è tanto semplice quanto quella che ho mostrato qui).
Non appena ho posto la domanda ho avuto un'illuminazione e fondamentalmente mi è venuta in mente la stessa cosa tranne che per il lambda (non ho ancora imparato a conoscerli). Ho appena scritto la mia funzione di cmp che accetta tupples da dict.items() e restituisce il risultato. Stessa cosa, solo un modo diverso di scriverlo. Grazie mille per la rapida risposta! – jay
Ottima soluzione. Adoro la semplicità di 'sorted()'. –
Penso che sia un po 'più chiaro in questo modo: ordinato (myDict.items(), key = lambda (k, v): v [2]) –