Вычисление количества дождливых месяцев для данного набора данных в Python

#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 в вашем цикле есть строка. чтобы сравнить его с a float , вам также нужно преобразовать его в a float : 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 вам также необходимо преобразовать его в a float : 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. Извините, я опубликовал это в то же время, когда вышел другой ответ.