2013-05-15 23 views
5

Consideriamo un dizionario campione di (valore chiave,) le coppie come segue:Prendi il corrispondono chiave per max (valore) in python dict

dict1 = {'a' : 10, 'x' : 44, 'f': 34, 'h':89, 'j': 90, 'd': 28, 'g' : 90} 
dict2 = {'a' : 10, 'x' : 44, 'f': 34, 'h':89, 'j': 90, 'd': 28} 

di tutti i valori nel dizionario, 90 è il più alto , Ho bisogno di recuperare la chiave corrisponde ad esso.

Quali sono i modi possibili per ottenere questo risultato. Qual è l'efficienza e perché?

Nota:

  1. chiavi e/o valori non sono in ordine per il dizionario. Il programma continua ad aggiungere nuove coppie (chiave, valore) al dizionario vuoto.

  2. Ci potrebbe essere più di una chiave per max (valore) Es: dict1 sopra dovrebbe tornare [ 'j', 'g'] dict2 di cui sopra dovrebbe tornare 'j'

    a) Se dict ha solo una chiave corrisponde a max (valore) quindi il risultato dovrebbe essere solo una stringa (es. chiave) b) Se dict ha più di una chiave corrisponde a max (valore), il risultato dovrebbe essere l'elenco di stringhe (es.

+0

Tornando una stringa o una lista di stringhe sembra probabile che si traducano in inutili diramazioni ter. Il 90% delle volte starai meglio restituendo sempre una lista. – DSM

risposta

6

Si può fare:

maxval = max(dict.iteritems(), key=operator.itemgetter(1))[1] 
keys = [k for k,v in dict.items() if v==maxval] 
+0

Non funziona se il dict ha più di una chiave per il massimo corrispondente (val). Vedere le definizioni aggiornate dict1 e dict2 sopra per maggiori dettagli. – Kumar

+0

Il tuo nuovo codice non funzionerà, perché "maxval" non è il valore massimo, ma uno dei tasti che raggiunge il valore massimo. – DSM

+0

@DSM :) Blunder !! Grazie mille. – karthikr

7

Usa max() e la lista di comprensione:

>>> dic = {'a' : 10, 'x' : 44, 'f': 34, 'h':89, 'j': 90, 'd': 28,"k":90} 
>>> maxx = max(dic.values())    #finds the max value 
>>> keys = [x for x,y in dic.items() if y ==maxx] #list of all 
                #keys whose value is equal to maxx 
>>> keys 
['k', 'j'] 

creare una funzione:

>>> def solve(dic): 
    maxx = max(dic.values()) 
    keys = [x for x,y in dic.items() if y ==maxx] 
    return keys[0] if len(keys)==1 else keys 
... 
>>> solve({'a' : 10, 'x' : 44, 'f': 34, 'h':89, 'j': 90, 'd': 28}) 
'j' 
>>> solve({'a' : 10, 'x' : 44, 'f': 34, 'h':89, 'j': 90, 'd': 28, 'g' : 90}) 
['g', 'j'] 
Problemi correlati