2015-02-27 11 views
3

Я пишу программу, которая через во время цикла принимает введенные пользователем данные и добавляет каждое значение в список (они являются температурами), пока пользователь не войдет 'q' (выйти). Мне нужно найти минимальное и максимальное значение списка. Вот мой код до сих пор:Найти минимальное, максимальное значение списка в Python

temps = [] 
daily = 1 

daily = float(daily) 
while daily != "q": 
    daily = (raw_input("Today's Temperature: ")) 
    if str.isdigit(daily) and daily>0: 
     temps.append(daily) 
    elif daily<0: 
     print "Positive temperatures only please." 
else: 
    print "Calculating statistics..." 

temps = sorted(temps) 
print map(float, temps) 

maximum = (max(temps)) 
print "Maximum:",maximum 

Когда я запускаю это и введите значение (90, 80, 70, 60, 50, кв) он отлично работает и дает мне 90, как максимум и 50, как минимум.

Однако, когда я запускаю это и вводим значения (30, 28, 1, 9, 26, 14, q), он возвращает 9 как максимум и 1 как минимум.

В основном, он обрабатывает 9.0 как больше любого числа, которое начинается с 8 или менее. (т. е. 88, 56, 30 и т. д.)

Как это исправить?

+6

Не читать код, но вы, вероятно, сравнение строк, а не числа. Да, все эти температуры - это струны. Используйте 'int' или' double', чтобы превратить их в фактические числа. –

+0

@tobias_k python использует 'float' not' double' – Holloway

+0

Если какой-либо из ответов решил вашу проблему, пожалуйста, рассмотрите _accepting_ ответ, чтобы пометить вопрос как разрешенный. –

ответ

2

Вы не конвертируете daily в float внутри вашего цикла, таким образом, все эти значения в списках являются строками. И как строка, "9" больше, чем "30". Аналогично, сравнение daily>0 не работает должным образом, поскольку вы сравниваете строки с числами; это условие всегда будет истинным - за исключением Python 3, где оно по праву может вызвать исключение.

Я предлагаю вам попробовать что-то вроде этого:

while True: 
    daily = raw_input("Today's Temperature: ") 
    if daily == "q": 
     break 
    elif daily.isdigit() and float(daily) > 0: 
     temps.append(float(daily)) 
    else: 
     print "Positive numeric temperatures only please." 
1

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

temps = [] 

while True: 
    daily = raw_input("Today's Temperature: ") 
    if daily == 'q': 
     break 
    elif daily.isdigit(): 
     daily = float(daily) # after this you can do whatever you want with daily as a number 
     if daily > 0: 
      temps.append(daily) 
     elif daily == 0: 
      print "Temperature 0 is not allowed." 
    else: 
     print "Only possitive numbers for temperature please." 


temps.sort() 
print temps[0] # returning the minimum value 
print temps[-1] # returning the maximum value 

Вы также можете использовать кучки (если вы хотите, чтобы обеспечить логарифмическое время работы):

import heapq 

heapq.heapify(temps) 
print heapq.nsmallest(1, temps) 
print heapq.nlargest(1, temps) 
+0

И функция 'print()' отличается в Python 3. – mbomb007

+0

@xRa Я бы рекомендовал обратное ваше 'daily! = 'Q'' сказать:' if daily ==' q ': break' и не использовать 'else' иметь меньше отступов (проще читать, когда блоки условного кода растут больше, чем пары строк). – smassey

+0

Что произойдет, если 'daily == 0'? –

Смежные вопросы