Pythonic方法查找字典数组的最大值和最小值

时间:2017-07-18 10:04:16

标签: python list dictionary slice

我有什么:

vec=[{'max': 23.425, 'date': u'2017-07-18', 'ismax': False, 'ismin': False, 'min': 14.615}, 
     {'max': 23.83, 'date': u'2017-07-19', 'ismax': False, 'ismin': False, 'min': 14.765}, 
     {'max': 24.07, 'date': u'2017-07-20', 'ismax': False, 'ismin': False, 'min': 14.985}]

现在我想找到整体的最小值和最大值;我试过这样做:

mini=min(vec[:]['min'])
maxi=max(vec[:]['max'])

但它说:

  

类型错误索引必须是整数而不是str

我知道冒号代表'循环所有指数'所以我做错了什么?

3 个答案:

答案 0 :(得分:6)

vec[:]只是复制一份清单。因此vec[:]['min']会尝试在副本中查找'min',但由于列表索引必须是整数,因此不起作用。

生成器表达式的好工作:

mini = min(v['min'] for v in vec)

答案 1 :(得分:2)

您还可以将minmax函数与key参数一起使用:

In [966]: max(vec, key=lambda x: x['max'])['max']
Out[966]: 24.07

In [967]: min(vec, key=lambda x: x['min'])['min']
Out[967]: 14.615

您可以使用operator.itemgetter来加快速度。

使用带键的这些函数会返回包含最大/最小值的整个子字典,因此您需要使用索引来检索所需的值。

时序:

设置:vec = [{ 'max' : random.randint(1, 1000), 'min' : random.randint(1, 1000)} for x in range(100000)]

# @RemcoGerlich's solution
In [990]: %timeit min(v['min'] for v in vec)
100 loops, best of 3: 10.8 ms per loop

# proposed in this post
In [991]: %timeit min(vec, key=operator.itemgetter('min'))['min']
100 loops, best of 3: 9.19 ms per loop

答案 2 :(得分:2)

只需使用min() / max()函数中的key参数

min(vec, key=lambda x: x['min'])
max(vec, key=lambda x: x['max'])

min()给出:

{'ismin': False, 'min': 14.615, 'date': '2017-07-18', 'ismax': False, 'max': 23.425}

点击以上链接到python doc获取详细信息。