Python 在多维dict中查找值的最大值和最小值

Python 在多维dict中查找值的最大值和最小值,python,dictionary,Python,Dictionary,我想找到 1.具有最大负载\u 1min值的键, 2.具有最小负载值的按键, 3.统计数据的所有load_min键的平均值 最后一个很简单,但前两个很难。 我试过了 最大功能失败。使用键参数设置min和max: stats = {{'node100': {'load_1min': '0.58'}, 'node200': {'load_1min': '0.64'}, 'node28': {'load_1min': '0.69'}} 除了迭代键之外,它还会查找字典中的每个键。要避免额外的查找,请执

我想找到
1.具有最大负载\u 1min值的键,
2.具有最小负载值的按键,
3.统计数据的所有load_min键的平均值

最后一个很简单,但前两个很难。 我试过了
最大功能失败。

使用
参数设置
min
max

stats = {{'node100': {'load_1min': '0.58'}, 'node200': {'load_1min': '0.64'}, 'node28': {'load_1min': '0.69'}}
除了迭代键之外,它还会查找字典中的每个键。要避免额外的查找,请执行以下操作:

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

由于python列表本质上是无序的,并且您的数字恰好是字符串,所以您必须跳转几圈才能正确完成此操作,但这并不太糟糕

首先构建一个列表,其中包含
load_1min
的所有值,其中值转换为浮点数而不是字符串:

>>> 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'})
找到
最小值
最大值
以及
平均值
非常简单:

all_values = [float(value['load_1min']) for value in stats.values()]
再次查找与此匹配的关键点:

minimum = min(all_values)
max = max(all_values)
average = sum(all_values)/len(all_values)
最小值的重复非常简单


如果您觉得它更容易理解,请使用此选项,但老实说,NPE的答案更优雅。我自己甚至不知道
参数。

对于平均值:
统计值()中x的求和(float(x['load_1min'))/len(stats)
答案很好,但如果多个键具有相同的值,则无法确定所需的条件。一个缺点是,在这种情况下,这只会返回一个(实际上是随机的)具有最大/最小值的密钥。谢谢。。事实上,你的答案更有效,因为在NPE中,迭代/转换会发生两次。此外,使用items()只需要值()。@火山可能稍微更有效,但在我的书中,
(优雅+可读性)>效率
。@如果你有大量数据,效率就会成为一个问题。您的解决方案可能看起来有点粗糙,但它仍然是健壮和可读的(lambda可能会对性能造成额外负担),顺便说一句,
stats
是一个列表。因此,stats.values()中的
值将导致错误。@aIKid
stats
不是
列表
。。。从技术上讲,它是一个只有一个值的
集合
,它本身会出错,因为您无法在
集合
中存储
dict
。假设额外的花括号是一个明显的打字错误。不知道你从哪里得到的
列表。
max_key = [key for key, value in stats.items() if value['load_1min'] == max]