1

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

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

4 回答 4

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
于 2013-07-05T18:52:16.297 回答
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)

也就是说,它依赖于类型测试,这并不优雅。我通常建议你不要做这种事情,要么跟踪最大值,要么找到更好的数据结构来表示这些信息,例如堆。

ideone在这里:http: //ideone.com/rJ1YZh

于 2013-07-05T18:56:16.540 回答
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'
于 2013-07-05T18:57:03.887 回答
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

您可能可以将对字典的引用保存为一个简单的整数标志,为了清楚起见,我只是在此处进行了此操作

于 2013-07-05T18:39:58.277 回答