使用Python获取基于多个字典对象的最大值

时间:2013-07-05 18:34:25

标签: python dictionary

我有一个字典项目,我想从中获得最大值。这本词典由2个词典组成。以下是字典

new_f_key: {'previous_f_key': {'1g': ['33725.7', '-70.29'],
                               '2g': ['35613.3', '108.83'],
                               '3g': ['32080.9', '-69.86']},
            'f_key': {'1g': ['8880.8', '-66.99'],
                      '2g': ['6942.6', '114.79'],
                      '3g': ['12300.3', '-70.34']}}

我试图使用上面的iteritems()itemgetter(),但我没有得到我想要的价值。

它应该比较两个词典中的所有值,并输出最高的值,并输出该项目的标题以及它所在的字典。

例如,在上面的字典中,最大值为35613.3,其关键字为2g,它出现在第一个字典对象previous_f_key中。

4 个答案:

答案 0 :(得分:1)

dic = {'previous_f_key': {'1g': ['33725.7', '-70.29'],
                               '2g': ['35613.3', '108.83'],
                               '3g': ['32080.9', '-69.86']},
            'f_key': {'1g': ['8880.8', '-66.99'],
                      '2g': ['6942.6', '114.79'],
                      '3g': ['12300.3', '-70.34']}}

maxx = float('-inf')
for d,v in dic.iteritems():
    for k,v1 in v.iteritems():
        loc_max = float(max(v1, key = float))
        if loc_max > maxx:
            outer_key = d
            header = k
            maxx = loc_max

print outer_key, header, maxx

<强>输出:

previous_f_key 2g 35613.3

答案 1 :(得分:1)

这样做。它将处理任意嵌套,并且它很短。

def weird_max(d, key=float):
    vals = []
    for item in d.itervalues():
        if isinstance(item, dict):
            vals.append(weird_max(item))
        else: # should be a list
            vals.extend(item)
    return max(vals, key=key)

也就是说,它依赖于类型测试,而不是优雅。我通常建议您不要做这种事情,要么保持最大值的运行轨迹,要么找到更好的数据结构来表示这些信息,例如:一堆。

在此处:http://ideone.com/rJ1YZh

答案 2 :(得分:1)

检查出来:

def maxVal(d):
    if all(isinstance(v, list) for v in d.values()):
        return max(d, key=lambda k: max(d[k]))
    else:
        k = max(d, key=lambda k: maxVal(d[k]))
        return k + ":" + maxVal(d[k])

<强>测试

In [79]: %paste
    def maxVal(d):
        if all(isinstance(v, list) for v in d.values()):
            return max(d, key=lambda k: max(d[k]))
        else:
            k = max(d, key=lambda k: maxVal(d[k]))
            return k + ":" + maxVal(d[k])

## -- End pasted text --

In [80]: %paste
dic = {'previous_f_key': {'1g': ['33725.7', '-70.29'],
                               '2g': ['35613.3', '108.83'],
                               '3g': ['32080.9', '-69.86']},
            'f_key': {'1g': ['8880.8', '-66.99'],
                      '2g': ['6942.6', '114.79'],
                      '3g': ['12300.3', '-70.34']}}

## -- End pasted text --

In [81]: maxVal(dic)
Out[81]: 'previous_f_key:2g'

答案 3 :(得分:0)

您需要创建一个嵌套循环:

max = -1
maxkey = -1
maxdic = -1
for dic_name, dic in new_f_key.iteritems():
     for key, val in dic.iteritems():
          if val > max:
              max = val
              maxkey = key
              maxdic = dic_name

你可以将对字典的引用保存为一个简单的整数标志,为了清楚起见,我在这里做了这个