Печать второго наименьшего числа в данном списке с помощью цикла - PullRequest
0 голосов
/ 04 мая 2020

, поэтому я пытаюсь использовать al oop, чтобы найти не только одно, но и второе значение с самым низким номером в данном списке. Я попытался сделать это с помощью for l oop, но вместо того, чтобы печатать два значения, я получаю только одно значение, напечатанное двенадцать раз. Позвольте мне продемонстрировать:

months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']

# List of average monthly rainfall for each month in "months":

rainfall = [3.1, 3.1, 2.6, 1.1, 0.2, 0, 0, 0.2, 0.4, 0.4, 2, 2.1]

# Calculations and printing the results:

print("1. Total rainfall for 2019 in Los Angeles, California:", sum(rainfall), "inches.")
print("2. Average monthly rainfall for 2019 in Los Anges, California:", sum(rainfall) / len(rainfall), "inches.")
print("Highest rainfall in 2019 was", max(rainfall), "in", months[rainfall.index(max(rainfall))])

for number in rainfall:
    print("The lowest rainfall in 2019 was", min(rainfall), "in", months[rainfall.index(min(rainfall))])

Это результат этого l oop:

1. Total rainfall for 2019 in Los Angeles, California: 15.2 inches.
2. Average monthly rainfall for 2019 in Los Anges, California: 1.2666666666666666 inches.
Highest rainfall in 2019 was 3.1 in January
June
June
June
June
June
June
June
June
June
June
June
June

Я также пытался использовать оператор if в пределах для l oop:

for number in rainfall:
    if rainfall < 0.2:
        "The Lowest rainfall in 2019 was", min(rainfall), "in", months[rainfall.index(min(rainfall))])

Это сообщение об ошибке трассировки:

"TypeError: '<' не поддерживается между экземплярами 'list' и 'float' </p>

что я здесь не так делаю ? Пожалуйста, помогите. Также, пожалуйста, будьте проще, я новичок в Python, и код месяцев [rainfall.index ()], который я вставил, - это то, что просит профессор, а также мин и макс Коды также требуются от моего профессора. Он также просит меня использовать al oop, чтобы распечатать два самых младших числа в списке осадков, чтобы соответствовать их соответствующим месяцам, следовательно, код месяцев (rainfall.index ()). Любая помощь Буду глубоко признателен, спасибо.

С уважением, Ана Бэйрд

1 Ответ

0 голосов
/ 04 мая 2020
very_big_number = float("inf")

# Initialize desired two lowest values to something big *
lowest_rf = very_big_number 
second_lowest_rf = very_big_number 

# Initialize the corresponding indexes to some weird value **
lowest_idx = -1
second_lowest_idx = -1

idx = 0
for number in rainfall:
    # If number is lower than the lowest we have, number becomes the lowest one now 
    # and the second lowest is changed to the lowest before seeing this number
    if number < lowest_rf:
        second_lowest_rf = lowest_rf
        lowest_rf = number
        # Assign the indexes respectively
        second_lowest_idx = lowest_idx
        lowest_idx = idx

    # If the current number is not lower than the lowest but it is in between two 
    # current lowests we have, update the second lowest and leave the lowest as is
    elif number < second_lowest_rf:
        second_lowest_rf = number
        second_lowest_idx = idx

    # Increase the running index 
    idx = idx + 1

# Report the desired values
print(lowest_rf, second_lowest_rf, lowest_idx, second_lowest_idx)

Первый оператор if проверяет, является ли number наименьшим на данный момент, и «сдвигает» второй наименьший на текущий наименьший, а текущий наименьший - на это число. Второе условие if - это случай, когда число находится между самым низким и вторым самым низким, и в этом случае мы сдвигаем только второе самое низкое значение на это число.

*: вместо этого можно использовать max(rainfall) + 1; цель состоит в том, чтобы начать с очень больших чисел (достаточно, чтобы они были больше, чем все записи в списке) для самых низких кандидатов, чтобы все number s в l oop были возможными кандидатами для самых низких значений. (подумайте, что произойдет, если мы начнем эти значения с -5)

**: -1 на самом деле не является странным индексом в Python, поэтому вы можете начать с чего-то вроде None или даже с пустой строки ; но поскольку они предназначены только для инициализаций и гарантированно изменятся (вышеуказанные инициализации lowests гарантируют это, пока список не пуст), это нормально.

Наконец, есть много возможностей для улучшения этого код (например, enumerate вместо запуска индекса), но должен быть в порядке для начинающих.

...