2012-10-20 22 views
8

Dire che ho un dizionario e quindi ho una lista che contiene le chiavi del dizionario. C'è un modo per ordinare l'elenco in base ai valori dei dizionari?Ordina una lista in base ai valori del dizionario in python?

ho cercato questo:

trial_dict = {'*':4, '-':2, '+':3, '/':5} 
trial_list = ['-','-','+','/','+','-','*'] 

sono andato a usare:

sorted(trial_list, key=trial_dict.values()) 

e ottenuto:

TypeError: 'list' object is not callable 

poi sono andato ad andare creare una funzione che potrebbe essere chiamato con trial_dict.get():

def sort_help(x): 
    if isinstance(x, dict): 
     for i in x: 
      return x[i] 

sorted(trial_list, key=trial_dict.get(sort_help(trial_dict))) 

Non credo che la funzione sort_help abbia comunque alcun effetto sull'ordinamento. Non sono sicuro che l'utilizzo di trial_dict.get() sia il modo corretto per farlo.

risposta

8

dict.get è quello corretto (o almeno, il più semplice) modo:

sorted(trial_list, key=trial_dict.get) 

Come Mark Amery ha commentato, l'equivalente lambda esplicito:

sorted(trial_list, key=lambda x: trial_dict[x]) 

potrebbe essere migliore, per almeno due ragioni:

  1. l'espressione di ordinamento è visibile e immediatamente modificabile
  2. non sopprime gli errori (quando l'elenco contiene qualcosa che non è nel dict).
+0

Oi, smetti di rispondere alle domande che sto rispondendo e dando risposte più intelligenti! :) Più seriamente: c'è una differenza di comportamento tra la risposta di thg e la mia. Il mio solleverà un'eccezione se trial_values ​​contiene un valore che non è una chiave di trial_dict, mentre thg's ordinerà in modo silenzioso quel valore in primo piano. O può essere appropriato a seconda del contesto. –

+0

@ thg435 Avrei dovuto ricontrollare i documenti, stavo chiaramente fraintendendo '.get'. – tijko

+0

@MarkAmery: [Sei stato bravo, ragazzo, vero bene. Ma finché sono in giro, sarai sempre il secondo migliore, vedi?] (Http://www.imdb.com/title/tt0110475/quotes))) – georg

5

L'argomento chiave nella funzione incorporata sorted (o il metodo sort di elenchi) deve essere una funzione che mappa i membri della lista che si sta ordinando ai valori che si desidera ordinare. Così si desidera che questo:

sorted(trial_list, key=lambda x: trial_dict[x]) 
+0

Dovrei tenere a mente lambda per una funzione più piccola come questa. Segnalo come risposta il thg435 ma, questo è stato di grande aiuto, dovrò pensare di usare il lambda per un uso futuro, grazie! :) – tijko

Problemi correlati