在多维字典中查找值的最大值和最小值

4
stats = {{'node100': {'load_1min': '0.58'}, 'node200': {'load_1min': '0.64'}, 'node28': {'load_1min': '0.69'}}

我希望找到:
1. 最大Load_1min值对应的键,
2. 最小Load_1min值对应的键,
3. 所有load_min键的平均值。

最后一个很简单,但前两个比较困难。 我尝试使用max函数,但失败了。

3个回答

10

使用key参数进行minmax操作:

>>> min(stats, key=lambda k:float(stats[k]['load_1min']))
'node100'
>>> max(stats, key=lambda k:float(stats[k]['load_1min']))
'node28'

除了遍历键之外,这还会查找字典中的每个键。为了避免额外的查找:

>>> min(stats.items(), key=lambda (k,v):float(v['load_1min']))
('node100', {'load_1min': '0.58'})
>>> max(stats.items(), key=lambda (k,v):float(v['load_1min']))
('node28', {'load_1min': '0.69'})

1
而对于平均值:sum(float(x['load_1min']) for x in stats.values())/ len(stats) - Ashwini Chaudhary
很好的答案,但如果多个键具有相同的值,则对所需条件不确定。一个缺点是,如果这种情况发生,它只会返回一个(有效随机的)具有最大/最小值的键。 - Slater Victoroff
谢谢,那真是简洁优雅。 - user1579557

3
由于Python列表本质上是无序的,并且您的数字恰好是字符串,因此您需要跳过一些步骤才能正确地执行此操作,但情况并不太糟糕。首先构建一个包含所有load_1min值的列表,其中这些值被转换为浮点数而不是字符串:
all_values = [float(value['load_1min']) for value in stats.values()]

寻找最小值min、最大值max和平均值average是相当简单的:
minimum = min(all_values)
max = max(all_values)
average = sum(all_values)/len(all_values)

请再查找与此实际匹配的键:
max_key = [key for key, value in stats.items() if value['load_1min'] == max]

最小值的重复很简单。

如果你觉得这样更易懂,可以使用这种方法,但说实话,NPE的答案更加优雅。我自己甚至不知道key参数。


实际上,你的答案更有效率,因为在NPE中迭代/转换发生了两次。此外,只需要使用_values()_,使用_items()似乎是多余的。 - volcano
@volcano也许会更加高效一些,但是在我的看法中(优雅+可读性) > 高效性 - Slater Victoroff
如果你有大量的数据块,效率就成了一个问题。你的解决方案可能看起来有点粗糙,但它仍然是强大和可读的(而且lambda表达式可能会增加性能负担)。 - volcano
顺便提一下,stats 是一个列表。因此 value in stats.values() 会导致错误。 - aIKid
@aIKid stats 不是一个 list... 从技术上讲,它是一个只有一个值的 set,这本身就会出错,因为你不能在 set 中存储一个 dict。 我假设额外的花括号是明显的打字错误。不确定你从哪里得到了 list 的东西。 - Slater Victoroff
哦,糟糕。我的错。是一个集合,抱歉。 - aIKid

0
stats = {'node100': {'load_1min': '0.58'}, 'node200': {'load_1min': '0.64'}, 'node28': {'load_1min': '0.69'}}
alist=[[float(value2) for item2, value2 in value.items()] for key,value in stats.items()]
results_val=(min(alist),max(alist))
print(results_val)

输出:

Min,     Max
([0.58], [0.69])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接