【问题标题】:Get Maximum Value based upon Multiple Dictionary Objects using Python使用 Python 根据多个字典对象获取最大值
【发布时间】:2013-07-06 02:57:03
【问题描述】:

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

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中。

【问题讨论】:

  • 为什么一切都是字符串?这是 JSON 吗?你能单独跟踪最大值吗?
  • 这些值不是字符串,而是浮点值。
  • 我在看你的问题,它们肯定是字符串。

标签: python dictionary


【解决方案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

【讨论】:

  • 效果很好。这就是我要找的。谢谢
  • @buggsbunny4 很高兴有帮助。 :) 如果对您有用,请随时 accept the answer。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    看看这个:

    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'
    

    【讨论】:

    • 我从来没有想过将当前函数作为键传递。我注意到这最终会多次遍历结构。
    • 遗憾的是,它最终会多次遍历该结构。不过我想知道,如果我可以编写一个max 来返回密钥并进行遍历,这样我就不必每次都调用python 的max。或者这可能是一个很好的动态编程记忆的候选者
    • 如果您查看我的解决方案,它只会遍历一次(最多 - 两次)。执行此操作的最佳方法是维护一个包含找到的最高项目的变量。我的解决方案不是因为我喜欢简洁和可读性。
    • 我确实阅读了您的解决方案 (+1)。但我也想提供一个递归解决方案
    • 我现在看到了不同之处。我认为可以肯定地说它们各有优势
    【解决方案4】:

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

    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
    

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

    【讨论】:

    • 不。遍历 dict 会产生密钥。另外,如果嵌套不止一层会怎样?
    • 抱歉这个错误,刚刚修复了第一个。如果有“多于一层的嵌套”是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2022-12-02
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2012-11-07
    • 1970-01-01
    相关资源
    最近更新 更多