基本上我创建了一个允许我显示以下输出的函数:
Jan - Mar 24.00
Feb - Apr 25.00
Mar - May 26.00
Apr - Jun 27.00
May - Jul 28.00
Jun - Aug 29.00
Jul - Sep 30.00
Aug - Oct 31.00
Sep - Nov 32.00
Oct - Dec 44.00
我做了以下功能,但我觉得它太大了。请问我可以帮助减少这个尺寸吗?所有这些值都存储在列表中。
def movingMean():
average = sum(rainValues[0:3])
finalavg = float(average)//3
print(months[0],"-",months[2],"%.2f" %finalavg)
average = sum(rainValues[1:4])
finalavg = float(average)//3
print(months[1],"-",months[3],"%.2f" %finalavg)
average = sum(rainValues[2:5])
finalavg = float(average)//3
print(months[2],"-",months[4],"%.2f" %finalavg)
average = sum(rainValues[3:6])
finalavg = float(average)//3
print(months[3],"-",months[5],"%.2f" %finalavg)
average = sum(rainValues[4:7])
finalavg = float(average)//3
print(months[4],"-",months[6],"%.2f" %finalavg)
average = sum(rainValues[5:8])
finalavg = float(average)//3
print(months[5],"-",months[7],"%.2f" %finalavg)
average = sum(rainValues[6:9])
finalavg = float(average)//3
print(months[6],"-",months[8],"%.2f" %finalavg)
average = sum(rainValues[7:10])
finalavg = float(average)//3
print(months[7],"-",months[9],"%.2f" %finalavg)
average = sum(rainValues[8:11])
finalavg = float(average)//3
print(months[8],"-",months[10],"%.2f" %finalavg)
average = sum(rainValues[9:])
finalavg = float(average)//3
print(months[9],"-",months[11],"%.2f" %finalavg)
答案 0 :(得分:2)
根据您发布的内容,我会将其简化为类似的内容。
def movingMean():
#Assuming python3, use xrange in python 2
#Generate numbers 0 - 9
for x in range(0, 10):
#Hardcoding 9 because you are dealing with dates and this won't change
if x == 9:
average = average_calculator(rainValues[x:])
print(months[x],"-",months[],"%.2f" %average)
else:
average = average_calculator(rainValues[x:x+3])
print(months[x],"-",months[x+3],"%.2f" %average)
#Function assumes you are passing float into it, returns an int as it is
def average_calculator(sum):
return sum // 3
在查看您发布的代码时,它只执行2项操作,1 - 计算平均值,2 - 打印平均值。所以我将程序拆分为一个可重用的函数来计算平均值和一个带有print语句的for循环。
也只是关于average_calculator的旁注:
这个函数内部的转换是不必要的,因为我假设sum将是一个浮点数。我也写它来模仿你正在做的事情。然而//是python中的floor division运算符 - 9 // 2 = 4这意味着该函数将始终返回一个int,即使你将它转换为float也将变为9.0 // 2.0 = 4.0。我不完全确定你在你的程序中做了什么,但是如果你不知道,因为看起来你想要一个像9.32
之类的打印浮动。要返回浮点除法结果,可以在Python 2中转换为浮点数,或者只使用Python 3中的常规除法运算符。(您也可以在python 2中从__future__
导入)
此代码:
average = sum(rainValues[0:3])
finalavg = float(average)//3
成为对average_calculator的调用,如下所示:
average_calculator(sum(rainValues[0:3]))
这会返回一个表示计算出的平均值的浮点数,但不是为每个月份重复此代码,而是使用变量,因此可以重复使用。
然后你的打印语句如下所示:
print(months[0],"-",months[2],"%.2f" %finalavg)
一般来说,硬编码这样的数字是不好的做法,尽管这取决于你自己的判断,因为它们是几个月,无论如何都会有12个月。
我用这个替换了你的打印语句:
#Assuming python3, use xrange in python 2
#Generate numbers 0 - 9
for x in range(0, 10):
#Hardcoding 9 because you are dealing with dates and this won't change
if x == 9:
average = average_calculator(rainValues[x:])
print(months[x],"-",months[],"%.2f" %average)
else:
average = average_calculator(rainValues[x:x+3])
print(months[x],"-",months[x+3],"%.2f" %average)
以便通过更改x的值来循环,使用average_calculator()
调用计算每个平均值并打印每个平均值。我使用if语句来说明过去3个月,因为这个打印语句与其他所有语句不同。
我无法测试此代码,因为您发布的代码不完整且没有数据集,但我相信这应该可以正常工作,如果您有任何问题请告诉我。
答案 1 :(得分:0)
循环索引
for i in range(len(rainValues)-2):
average = sum(rainValues[i:i+3]) // 3
print(months[i],"-",months[i+2],"%.2f" % average)
虽然您应该意识到// 3除以int,并且在点之后总是有两个0。另外,格式是首选。
for i in range(len(rainValues - 2)):
average = sum(rainValues[i:i+3]) / 3
print("{} - {} {:.2f}".format(months[i], months[i+2], average)
使用生成器有更好的方法可以做到这一点,但为了保持这一点,这是有效的。
更新:对于基于生成器的解决方案,您可以使用我称之为 sliding_window 的术语来自网络。
import itertools
def sliding_window(iterable, win_sz):
for i in itertools.count():
ret = iterable[i:i+win_sz]
if len(ret) != win_sz: break
yield ret
然后可以使用3作为窗口大小。如果你想要,你也可以将大小作为函数的参数,并提供不同长度的平均值。
for vals in sliding_window(rainValues, 3):
average = sum(vals) / len(vals)
print(average)