2013-05-15 14 views
5

Rozważmy słownika próbki (klucz, wartość) pary, co następuje:dostać klucz odpowiadają max (wartości) w Pythonie 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} 

wszystkich wartości w słowniku, 90 jest najwyższa , Potrzebuję odzyskać klucz odpowiada mu.

Jakie są możliwe sposoby, aby to zrobić. Który jest skuteczny i dlaczego?

UWAGA:

  1. Keys i/lub wartości nie są w porządku do słownika. Program dodaje nowe pary (klucz, wartość) do pustego słownika.

  2. Może być więcej niż jeden przycisk dla max (wartość) Np powyżej dict1 powinna powrócić [ 'j', 'g'] dict2 powyżej należy zwrócić 'j'

    a) Jeżeli DICT ma tylko jeden klucz odpowiada max (wartość), wtedy wynik powinien być tylko ciągiem znaków (tj. kluczem) b) Jeśli dict ma więcej niż jeden klucz odpowiada max (wartość), wówczas wynik powinien być listą ciągów znaków (iekeys).

+0

Skrutacyjnej albo łańcuch lub listę ciągów prawdopodobnie spowoduje niepotrzebne rozgałęzienia ter. 90% czasu, gdy jesteś w lepszej sytuacji, zawsze zwraca listę. – DSM

Odpowiedz

6

można zrobić:

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

Nie działa, jeśli dict ma więcej niż jeden klucz dla odpowiedniego max (val). Zobacz zaktualizowane definicje dict1 i dict2 powyżej, aby uzyskać więcej szczegółów. – Kumar

+0

Twój nowy kod nie będzie działał, ponieważ 'maxval' nie jest wartością maksymalną, ale jednym z kluczy, które osiągają maksymalną wartość. – DSM

+0

@ DSM :) Blunder !! Dziękuję bardzo. – karthikr

7

Użyj max() i listowych:

>>> 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'] 

Utwórz funkcję:

>>> 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'] 
Powiązane problemy