我有什么:
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
我知道冒号代表'循环所有指数'所以我做错了什么?
答案 0 :(得分:6)
vec[:]
只是复制一份清单。因此vec[:]['min']
会尝试在副本中查找'min'
,但由于列表索引必须是整数,因此不起作用。
生成器表达式的好工作:
mini = min(v['min'] for v in vec)
答案 1 :(得分:2)
您还可以将min
和max
函数与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)