2017-03-07 14 views
0

私は値を持つpython辞書を持っており、私は最大のキーを検索する必要があります。Python辞書から最高のキーを取得

data={'A': 1,'C': 3, 'H': 1,'I': 1, 'B': 1,'J': 2,'S': 1, 'D': 3, 'N': 2} 

私はmax(data, key=data.get) .Thisが、私はCとDの両方が最大数であるため、答えとしてC & Dを取得したいのですがanswer.ButとしてCを与えてみてください。

これはPythonでどのように行うことができますか?

+0

あなたは古いものをご提示ください、これが重複していると述べた場合。 Thx –

答えて

4

maxだけでは、maxは1つの要素を返すため、これを行うことはできません。代わりに、最初にの値をdataから取得し、同じ値を持つキーをフィルタリングします。

>>> data={'A': 1, 'T': 1, 'C': 3, 'H': 1, 'I': 1, 'B': 1, 'O': 1,'J': 2, 'Q': 1, 'S': 1, 'D': 3, 'N': 2} 
>>> max_val = max(data.values()) 
>>> [key for key, val in data.items() if val == max_val] 
['C', 'D'] 
0

これはなんですか?

max_keys = [ k for k, val in data.items() if val == max(data.values()) ] 
+3

ここであなたは 'max(..)'の部分を評価します**毎時** ... –

+0

'values()'は既にリストを返しています。ループ。 – ChatterOne

+0

真の場合は、最大値を別々に計算し、それに直接マッチさせる方が良いです。しかし効率についての特定の懸念は認められなかったので、私は1ライナーのバージョンを好みました。 – GPhilo

0

逆マップを作成します。

from collections import defaultdict 
reverse_data_map = defaultdict(list) 

for k, v in data.items(): 
    reverse_data_map[v].append(k) # it becomes a list of keys that share a value 

次に、最も高い値を取得し、それを使用してキーを取得します。

max_keys = reverse_data_map[max(reverse_data_map.keys())] 
print max_keys # ['C', 'D'] 
堅牢な機能として

from collections import defaultdict 

def get_all_max_keys(d): 
    reverse_map = defaultdict(list) 
    max_v = 0 
    for k, v in d.items(): 
     max_v = max(max_v, v) # more efficient method than finding the max afterwards 
     reverse_map[v].append(k) 
    return reverse_map[max_v] 

関数を呼び出す:

data={ 
    'A': 1, 'T': 1, 'C': 3, 'H': 1, 
    'I': 1, 'B': 1, 'O': 1, 'J': 2, 
    'Q': 1, 'S': 1, 'D': 3, 'N': 2, 
    } 

print get_all_max_keys(data) # ['C', 'D'] 
関連する問題