我有以下查询:
>>> 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
。
答案 0 :(得分:5)
您可以使用列表推导过滤结果,然后使用sum
和len
计算平均值:
>>> 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)
您可以使用python3
,filter
和statistics.mean在chain
内完成所有操作:
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')