2013-10-04 2 views
0

Мне сказали сделать класс, который выводит размер, мин, макс и т. Д. Без использования списка и имеющих атрибуты в основном в def add..My-атрибуты работают нормально для большинства но по какой-то причине я не могу получить минимум. Может ли кто-нибудь дать мне быстрый толчок в правильном направлении и сказать мне, если я иду по правильному пути с этим?минимум без использования списков

class Dataset(object): 

    def __init__(self): 
     self.totalScore=0 
     self.countScore=0 
     self._highest=0 
     self._lowest=0 
     self.dev=0 
     self.mean=0 

    def add(self, score): 
     self.countScore= self.countScore + 1 
     self.totalScore= self.totalScore + score 

     self.mean=self.totalScore/self.countScore 
     self.dev=self.mean - score 


     if score > self._highest: 
      self._highest = score 
     if score < self._lowest: 
      self._lowest = score 

    def size(self): 
     return(self.countScore) 


    def min(self): 
     return (self._lowest) 


    def max(self): 
     return (self._highest) 

мои результаты это:

This is a program to compute the min, max, mean and 
standard deviation for a set of numbers. 

Enter a number (<Enter> to quit): 50 
Enter a number (<Enter> to quit): 60 
Enter a number (<Enter> to quit): 
Summary of 2 scores. 
Min: 0 
Max: 60.0 
Mean: 55.0 
Standard Deviation: 7.0710678118654755 

ответ

5

Проблема заключается в том, что вы инициализировать ваш первоначальный self._lowest к 0 который бывает ниже всех входов. Вместо этого, вы можете попробовать следующее:

  • инициализировать его так: self._lowest = None
  • в add, изменить условия, чтобы установить self._lowest в score на первый звонок

Это будет выглядеть так:

if self._lowest is None or score < self._lowest: 
    self._lowest = score 

Таким образом, вы устанавливаете None как исходное значение, отличное от числа пока не найдено ни одного минимума. Затем он устанавливается в первый переданный score и обновляется до самого низкого уровня соответственно при последующих вызовах.

Аналогичная проблема произошла бы с вашей переменной self._highest для последовательности входов, которая меньше 0, то есть -9 -1 -5 -3.

Другая альтернатива, благодаря @SteveJessop, чтобы установить self._lowest и self._highest к float('inf') и float('-inf') соответственно. Это снизит ваши операторы if до:

self._lowest = min(self._lowest, score) 
self._highest = max(self._highest, score) 
+1

Совершенно разумно. Дешевой и жизнерадостной альтернативой является инициализация max/min с помощью 'float ('- inf')' и 'float ('inf')'. Тогда нет необходимости в специальном случае в этом коде. Недостатком является то, что результат немного менее полезен в случае, когда 'add' вообще не вызывается, т. Е. Нет баллов. –

+0

@SteveJessop, спасибо, не подумал об этом. Этот подход также уменьшает if-утверждения до простых вызовов 'min' /' max'. Я видел, что 'inf' и' -inf' являются полностью допустимыми начальными значениями для ряда алгоритмов, поэтому это просто вопрос соглашения или, в данном случае, форматирование вывода. –

+0

Большое вам спасибо. Я подумал, что это так, я просто не знал, как это сделать. Теперь я знаю лучше. –

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