#python
#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
Комментарии:
1.
x
в вашем цикле есть строка. чтобы сравнить его с afloat
, вам также нужно преобразовать его в afloat
:x = float(x)
. и, вероятно:num_rainy_months = 1
только в одной ветке, еслиif
… (нет особого смысла делать то же самое вif
иelse
ветке …)2. Используете ли вы python 2? Этот цикл должен завершиться сбоем на 2-й итерации…
3. Везде, где я ставлю num_rainy_months = 1 и x = float (x), я получаю ошибки, где мне это сделать
4. Я использую python 3
5. Что вы пытаетесь сделать с
rainfall_mi_list = list(rainfall_mi)
? Он больше нигде в программе не используется, удалите его.
Ответ №1:
есть несколько небольших ошибок:
x
в вашем цикле есть строка. чтобы сравнить его с a,float
вам также необходимо преобразовать его в afloat
:x = float(x)
- и, вероятно:
num_rainy_months = 1
только в одной ветвиif
… (нет особого смысла делать то же самое в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)
Комментарии:
1. @hiro главный герой: вы также можете напрямую суммировать логические значения.
num_rainy_months = sum((float(x) > 3 for x in rainfall_mi.split(",")))
2. @Guimoute очень элегантно! но, возможно, здесь многовато … (суммирование логических переменных не для начинающих …)
3. Ха-ха-ха, согласен, но суммирование понимания списка или генератора может быть слишком большим 😉
Ответ №2:
Есть пара небольших ошибок, которые вы неправильно поняли. Прежде всего, вы не сравниваете фактическое количество осадков с 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 — это строка, а не значение с плавающей точкой, поэтому вы хотите избавиться от пробелов и использовать значение с плавающей точкой:
num_rainy_months = 0 # this is fine
for x in rainfall_mi:
if float(x.strip()) > 3.0:
# code
Вы также не хотите устанавливать num_rainy_months равным x, поскольку x — это ваше значение осадков, вы просто хотите добавить 1, если x больше 3.0, и вам не нужно другое, потому что, если оно не больше 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:
Процедурным способом вы хотите в основном посчитать все элементы, которые имеют реальное (числовое) значение выше 3, что легко выполняется:
- Получаем список чисел (не строк) — готово с
rainfall_mi.split(",")
-
Проверьте, больше ли это число, чем 3.0 (сделано ниже):
int x = 0 for rainfall in rainfall_mi.split(","): if float(rainfall) > 3.0: x = 1
-
Распечатайте результат (сделано с помощью
print(x)
).
По сути, у вас была структура, но вам не хватало:
- Сверка фактического значения в списке с известным значением с плавающей точкой
- Преобразование значений из списка в значения с плавающей точкой, чтобы их можно было сравнить численно
Более питонический подход привел бы к сокращению. Вы могли бы отказаться от любых дополнительных структур данных или переменных и выразить это в виде списка, который выполняет то же самое.
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
- Проверяет длину результирующей новой структуры.
Ответ №4:
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(«,»)
для i в x:
if float(i) > 3.0:
num_rainy_months = 1
Комментарии:
1. Добро пожаловать в SO! Этот ответ идентичен уже принятому ответу; ответы, которые не добавляют ничего нового из существующих ответов, не одобряются. Кроме того, рекомендуется иметь описание, сопровождающее код, вместо ответа, состоящего исключительно из кода.
Ответ №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 = 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)
Ответ №6:
Здесь было несколько ошибок. Прежде всего, вам нужен список чисел. Во-вторых, что вы хотите, так это «Когда количество осадков превышает 3, считайте это дождливым месяцем и подсчитывайте его». То, что вы делали, это спрашивали, было ли количество дождливых месяцев больше трех, чего не было, потому что вы установили его равным нулю, а затем вы просто рекурсивно устанавливали количество дождливых месяцев для каждого x, пока x не закончится. Пожалуйста, ознакомьтесь с документацией по циклам for на python.
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
Комментарии:
1. Извините, я опубликовал это в то же время, когда вышел другой ответ.