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

使用Python基于多个字典对象获取最大值,python,dictionary,Python,Dictionary,我有一个字典项,希望从中获取最大值。这本词典由两本词典组成。下面是字典 new_f_key: {'previous_f_key': {'1g': ['33725.7', '-70.29'], '2g': ['35613.3', '108.83'], '3g': ['32080.9', '-69.86']}, 'f_key': {'1g': ['888

我有一个字典项,希望从中获取最大值。这本词典由两本词典组成。下面是字典

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\u-key

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

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
您可能可以将对字典的引用保存为一个简单的整数标志,我只是为了清楚起见在这里这么做的

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

这样做。它可以处理任意嵌套,而且很短

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在此:

请查看以下内容:

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'

不。在
dict
上迭代生成键。此外,如果存在多个嵌套级别,会发生什么情况?很抱歉出现此错误,刚刚修复了第一个错误。如果存在“不止一个层次的嵌套”,你是什么意思?为什么所有的东西都是字符串?这是JSON吗?你能单独跟踪最大值吗?值不是字符串,而是浮点值。我在看你的问题,它们肯定是字符串。我从来没有想过将当前函数作为键传递。我注意到,它最终会多次遍历结构。不幸的是,它确实会多次遍历结构。不过,我想知道我是否可以编写一个
max
来返回键和遍历,这样我就不必每次都调用python的
max
。或者这可能是一个很好的记忆动态编程的候选者,如果你看看我的解决方案,它只遍历一次(最多两次)。实现这一点的最佳方法是维护一个包含找到的最高项的变量。我的解决方案不适合,因为我喜欢简洁易懂。我确实读过你的解决方案(+1)。但是我也想提供一个递归解决方案,我现在看到了区别。我认为可以肯定地说,他们每个人都有自己的优势,这很好。这就是我要找的。Thanks@buggsbunny4很高兴这有帮助。:)如果它对你有用,请随时联系。