计算 Python 中给定数据集的雨月数



所以我的家庭作业问题是这样的:

rainfall_mi是一个字符串,包含密歇根州每个月的平均降雨英寸数(以英寸为单位),每个月用逗号分隔。编写代码以计算降雨量超过 3 英寸的月份数。将结果存储在变量num_rainy_months中。换句话说,计算值> 3.0 的项目数。

rainfall_mi的输出是 5,但我似乎无法正确处理,而且我觉得我在某个地方犯了一个我错过的小错误。

rainfall_mi = "1.65, 1.46, 2.05, 3.03, 3.35, 3.46, 2.83, 3.23, 3.5, 2.52, 2.8, 1.85"
rainfall_mi_list = list(rainfall_mi)
rainfall_mi_split = rainfall_mi.split(",")
num_rainy_months = 0
for x in rainfall_mi:
if num_rainy_months > 3.0:
num_rainy_months = x
else:
num_rainy_months = x

有几个小错误:

  • 循环中的x是一个字符串。 要将其与float进行比较,您还需要将其转换为floatx = float(x)
  • 并且可能:仅在if的一个分支中num_rainy_months += 1......(在ifelse分支中做同样的事情没有多大意义......
  • 您应该遍历rainfall_mi_split并将3.0进行比较x而不是num_rainy_months

总而言之:

rainfall_mi = "1.65, 1.46, 2.05, 3.03, 3.35, 3.46, 2.83, 3.23, 3.5, 2.52, 2.8, 1.85"
rainfall_mi_split = rainfall_mi.split(",")
num_rainy_months = 0
for x in rainfall_mi_split:
x = float(x)
if x > 3.0:
num_rainy_months += 1
print(num_rainy_months)

旁注:这也可以在一行中完成:

num_rainy_months = sum(1 for x in rainfall_mi.split(",") if float(x) > 3.0)

有几件小事你弄错了。首先,您没有将实际降雨量与 3.0 进行比较。

num_rainy_months,正如你刚刚声明的,等于 0,x 是你要检查的值:

num_rainy_months = 0 # this is fine
for x in rainfall_mi:
if x > 3.0: 
# code

正如@hiro主角指出的那样,X 是一个字符串,而不是一个浮点数,所以你想去掉空格并投射为 float:

num_rainy_months = 0 # this is fine
for x in rainfall_mi:
if float(x.strip()) > 3.0: 
# code 

你也不想num_rainy_months等于x,因为x是你的降雨量值,你只想在x大于3.0时加1,你不需要else,因为如果它不大于3.0,你只想忽略它:

num_rainy_months = 0 # this is fine
for x in rainfall_mi: # each x is a rainfall value
if float(x.strip()) > 3.0: # if the rainfall value, as float, is greater than 3
num_rainy_months += 1 # add 1 to rainy months

以程序化的方式,您希望基本上计算所有实际(数字)值高于 3 的项目,这很容易实现:

  • 获取数字(不是字符串)列表 - 使用rainfall_mi.split(",")完成
  • 检查该数字是否大于 3.0(如下所示):

    int x = 0
    for rainfall in rainfall_mi.split(","):
    if float(rainfall) > 3.0:
    x += 1
    
  • 打印结果(用print(x)完成)。

从本质上讲,你有结构,但你缺少:

  • 根据已知的浮点数检查列表中的实际
  • 将列表中的值转换为浮点数,以便可以对其进行数字比较

更Pythonic的方法将导致减少。 您可以避免使用任何额外的数据结构或变量,并在列表理解中表达这一点,这也会做同样的事情。

print(len([x for x in rainfall_mi.split(",") if float(x) > 3.0]))

这样做:

  • 字符串的元素拆分为用逗号分隔的单个数字
  • 将这些值添加到单独的列表 ([x for x in rainfall_mi.split(",")])
  • 过滤掉低于所需阈值的值if float(x) > 3.0
  • 检查生成的新结构的长度。

rainfall_mi = "1.65, 1.46, 2.05, 3.03, 3.35, 3.46, 2.83, 3.23, 3.5, 2.52, 2.8, 1.85">

num_rainy_months = 0

x = rainfall_mi.split(",")

对于 x 中的 i:

if float(i) > 3.0:
num_rainy_months += 1

这就是我的做法,希望对您有所帮助:

rainfall_mi = "1.65, 1.46, 2.05, 3.03, 3.35, 3.46, 2.83, 3.23, 3.5, 2.52, 2.8, 1.85"
rainfall_mi_list = rainfall_mi.split(", ")
num_rainy_months = 0
for n in range(0, len(rainfall_mi_list)):
if float(rainfall_mi_list[n]) > 3: 
num_rainy_months += 1
print(num_rainy_months)

这里有几个错误。首先,您需要一个数字列表。其次,你想要的是"当降雨量大于3时,将其视为雨月,并计算它。你所做的是询问雨月数是否大于三,这不是因为你把它设置为零,然后你只是递归地将雨月数设置为每个x,直到x用完。请阅读 python 中 for 循环的文档。

rainfall_mi = "1.65, 1.46, 2.05, 3.03, 3.35, 3.46, 2.83, 3.23, 3.5, 2.52, 2.8, 1.85"
rainfall_mi_split = rainfall_mi.split(",")
rainfall_mi_split=[float(x) for x in rainfall_mi_split]
num_rainy_months = 0
for x in rainfall_mi_split:
if x > 3.0:
num_rainy_months +=1

相关内容

最新更新