2014-11-01 3 views
0

У меня есть задание для моего компьютерного класса, и один из вопросов попросил нас написать код, который будет вычислять среднее число цифр, пока оно не попадет на букву (алфавит) ,Как рассчитать среднее значение цифры в Python

Это было описание:

Эта функция принимает в качестве входного одной строки, содержащей цифры или буквы. Функция должна возвращать одно число с плавающей запятой, равное среднему, рассчитанному с учетом всех цифр в строке, начиная с первой позиции в строке и считая все цифры до тех пор, пока не будет найдена одна буква или до достижения конца строки. Если цифр нет, функция должна вернуть значение 0.0.

Так что я придумал следующий код:

def avgUntilLetter (st): 
    digits1 = [int(x) for x in st if x.isdigit()] 
    total = sum(digits1) 
    if digits1: 
     avg = float(total)/len(digits1) 
     return avg 
    if st.isalpha(): 
     return 0.0 

Для ответа, например, я должен получить 2.0 в качестве возвращаемого значения, если CodeWrite положить в avgUntilLetter('123a456'). Я получаю среднее значение от всех цифр, что мне нужно для ввода кода, чтобы исправить это?

+1

Как можно заметить, что ваш код делает * не попытка * не останавливаться при достижении нецифровой; где-то вам придется «ломать», когда это произойдет. – jonrsharpe

+0

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

ответ

1

Вы принимаете все цифры, а не только те, которые были в начале. Вам нужно прекратить вычисление, когда вы сталкиваетесь с первым несимметричным.

Это проще, если вы просто перебираем все символы один на один и вспыхнуть, когда вы достигнете первой нецифры:

def avgUntilLetter(st): 
    total = count = 0 
    for x in st: 
     if not x.isdigit(): 
      break 
     count += 1 
     total += int(x) 
    if not count: 
     return 0.0 
    return float(total)/count 

Здесь count дорожки, сколько цифр, которые мы обнаружили в начале; если он еще 0 цифр не было найдено.

Демо:

>>> def avgUntilLetter(st): 
...  total = count = 0 
...  for x in st: 
...   if not x.isdigit(): 
...    break 
...   count += 1 
...   total += int(x) 
...  if not count: 
...   return 0.0 
...  return float(total)/count 
... 
>>> avgUntilLetter('123a456') 
2.0 
+0

О, спасибо, наш профессор действительно не научил нас функции enumerate(), поэтому я еще не изучил эту функцию самостоятельно. – Dennis

+0

@ Dennis: и я действительно ошибался, используя его; он всегда будет считать * слишком большим *, если в строке есть символ. Я удалил его. –

+0

О, хорошо. Спасибо вам за помощь :) – Dennis

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