所以我的家庭作业问题是这样的:
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
进行比较,您还需要将其转换为float
:x = float(x)
- 并且可能:仅在
if
的一个分支中num_rainy_months += 1
......(在if
和else
分支中做同样的事情没有多大意义...... - 您应该遍历
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