使用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很高兴这有帮助。:)如果它对你有用,请随时联系。