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()中的值将导致错误。@aIKidstats
不是列表
。。。从技术上讲,它是一个只有一个值的集合
,它本身会出错,因为您无法在集合
中存储dict
。假设额外的花括号是一个明显的打字错误。不知道你从哪里得到的列表。
max_key = [key for key, value in stats.items() if value['load_1min'] == max]