平均非空值

时间:2015-10-06 19:06:54

标签: python

我有以下查询:

>>> ItemMaster.objects.all()[:3].values_list('rt_rating', 'imdb_rating')
[(None, None), (None, Decimal('6.3')), (Decimal('7.6'), Decimal('7.4'))]

获得上述非空值的平均值的最佳方法是什么?对于上述内容,它将是(6.3 + 7.6 + 7.4) / 3

3 个答案:

答案 0 :(得分:5)

您可以使用列表推导过滤结果,然后使用sumlen计算平均值:

>>> li=[(None, None), (None, Decimal('6.3')), (Decimal('7.6'), 
>>> nums=[j for tup in li for j in tup if j]
>>> av=sum(nums)/len(nums)

答案 1 :(得分:2)

您可以使用python3filterstatistics.meanchain内完成所有操作:

from decimal import Decimal
from statistics import mean
from itertools import chain

l = [(None, None), (None, Decimal('6.3')), (Decimal('7.6'), Decimal('7.4'))]

print(mean(filter(None.__ne__,chain.from_iterable(l))))
7.1

None.__ne__意味着您保留Decimal('0'),这可能是您想要的,也可能不是。

答案 2 :(得分:0)

您可以使用itertools.chain获取所有非Null项目,然后filter删除Null项目 -

from itertools import chain

items = filter(None, list(chain(*ItemMaster.objects.all()[:3].values_list('rt_rating', 'imdb_rating'))))
==> [Decimal('6.3'), Decimal('7.6'), Decimal('7.4')]
sum(items)/len(items)
==> Decimal('7.1')