如果两个或多个键具有相同的值,则在字典中查找最大值

时间:2014-05-31 07:43:18

标签: python dictionary key max operator-keyword

我有一本字典说

a = {'2':134,'22':43,'31':134,'29':43}

现在使用operator package和max函数我可以轻松找到具有最大值的键。 但是,它只返回一个键(如果键的值相同,那也是最后一个键)。

max(a.iteritems(),key=operator.itemgetter(1))[0]

如何返回具有最大值的两个键。

5 个答案:

答案 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;这样就可以使用上面的代码立即找到最大值。