我有一本字典说
a = {'2':134,'22':43,'31':134,'29':43}
现在使用operator package和max函数我可以轻松找到具有最大值的键。 但是,它只返回一个键(如果键的值相同,那也是最后一个键)。
max(a.iteritems(),key=operator.itemgetter(1))[0]
如何返回具有最大值的两个键。
答案 0 :(得分:3)
为密钥创建defaultdict
映射值。
>>> a = {'2':134,'22':43,'31':134,'29':43}
>>> from collections import defaultdict
>>> b = defaultdict(list)
>>> for key, val in a.iteritems():
b[val].append(key)
>>> b
defaultdict(<type 'list'>, {43: ['29', '22'], 134: ['31', '2']})
>>> max(b)
134
>>> b[max(b)]
['31', '2']
答案 1 :(得分:1)
max_keys = []
max_value = None
for key, value in a.iteritems():
if max_value is None or value>max_value:
max_keys = [key]
max_value = value
elif value == max_value:
max_keys.append(key)
答案 2 :(得分:0)
您可以对项目进行排序,并使用itertools.groupby()
查找具有相等值的第一个组;第一组也是最大值:
from itertools import groupby
next([g[0] for g in group]
for key, group in groupby(
sorted(a.items(), key=operator.itemgetter(1), reverse=True),
operator.itemgetter(1)))
这是O(NlogN)操作。
演示:
>>> from itertools import groupby
>>> import operator
>>> a = {'2':134,'22':43,'31':134,'29':43}
>>> next([g[0] for g in group]
... for key, group in groupby(
... sorted(a.items(), key=operator.itemgetter(1), reverse=True),
... operator.itemgetter(1)))
['31', '2']
答案 3 :(得分:0)
您可以使用列表理解:
a = {'2':134,'22':43,'31':134,'29':43}
m=max(a.values())
print [k for k in a if a.get(k) == m]
['31', '2']
答案 4 :(得分:0)
另一种解决方案可能是构建一个&#34;倒置索引列表&#34;在#34;机器学习&#34;中大量使用和#34;网络信息检索&#34;,这样每次你需要找到与给定值相关的所有密钥时,你只需要参考一个反向索引列表:
inv_ind = {}
for key in a.keys():
if inv_ind.has_key(a[key]):
inv_ind[a[key]].append(key)
else:
inv_ind[a[key]] = [key]
这个解决方案只需要很少的代码行,O(n)时间,但需要双倍的空间来保存在内存中的两个字典。要检索最大值就足够了:
max(inv_ind.keys())
当您更新&#34; a&#34;你也更新&#34; inv_ind&#34;这样就可以使用上面的代码立即找到最大值。