使用sum
和来计算条件的平均值很容易使用列表理解进行过滤后使用。例如,要计算平均mpg
存在四个cylinders
,你可以这样做:
mpg4cylinder = [m for m, c in zip(mpg, cylinder) if c == 4]
# For greater precision with float summing, you may want to use math.fsum
cylinder4avg = sum(mpg4cylinder)/len(mpg4cylinder)
如果你使用Python的现代(3.4+),它甚至the statistics
module简单:
cylinder4avg = statistics.mean(m for m, c in zip(mpg, cylinder) if c == 4)
这比math.fsum
方法更加精确,并且更加简洁,换来更慢。
如果你正在计算所有气瓶的统计数据,而不仅仅是一个或两个气瓶,那么效率会有些低下。你可以通过液压缸将它们分组对这个进步的。你去:
from collections import defaultdict
cyl_to_mpgs = defaultdict(list)
for m, c in zip(mpg, cylinder):
cyl_to_mpgs[c].append(m)
现在,您可以得到任何给定的气缸数的平均值,而无需通过数据的整个列表搜索筛选出你想要的位,你只是做:
statistics.mean(cyl_to_mpgs[4.0])
它得到预过滤list
便宜(在单次预过滤具有所有气缸组合起来前)。你可以更简洁地为你做很多工作。的dataset
创建和人口可能只是:
# newline='' is the correct way to do csv in Py3; on Py2, you'd get rid of it
# but provide a mode argument of "rb"
with open('auto-mpg-data.csv', newline='') as f:
dataset = list(csv.reader(f))
mpg
是:
mpg = [float(row[0]) for row in dataset]
与cylinder
相同的模式。除append
值之外什么都不做的循环通常最好用list
构造函数或列表理解替代(如果list
已经具有值,则可以使用与list
/listcomps相同的参数或理解来调用extend
)。
而你的问题是...? – Julien