2015-04-24 3 views
0

Я написал большую часть своего кода, однако у меня возникают проблемы с вычислением среднего значения для положительных чисел, а также отрицательных чисел в данном списке. Функция работает, давая мне список и показывает мне numallavg, но не работает для положительных и отрицательных функций. Это весь мой код:Вычисление положительных/отрицательных чисел Средние значения в Python

def numbersList(): 
    values = [] 
    while -9999 not in values: 
     x = int(input('Enter any amount of numbers (-9999 to end): ')) 
     values.append(x) 
    values.remove(-9999) 
    print('This list of all numbers entered is: ') 
    print(values) 
    return values 

def allNumAvg(values): 
    average = 0 
    sum = 0 
    for n in values: 
     sum = sum + n 
    average = (sum/len(values)) 
    return average 

print(allNumAvg(numbersList())) 

def posNumAvg(values): 
    x = [] 
    average = 0 
    sum = 0 
    if int in values > 0: 
     x.append(int) 
    print(x) 

def nonPosAvg(values): 
    y = [] 
    average = 0 
    sum = 0 
    if int in values < 0: 
     y.append(int) 
    print(y) 
+0

'int' тип, поэтому' INT в values' является 0. – molbdnilo

ответ

0

Попытка записать эти функции в подобной манере, как allNumAvg:

def posNumAvg(values): 
    quantity = 0 
    average = 0 
    sum = 0 
    for n in values: 
     if n > 0: 
      sum += n 
      quantity += 1 
    average = float(sum)/quantity 
    return average 

Есть много вещей, которые могут быть улучшены в этом коде, хотя. Например, average не нужно инициализировать как 0, sum - встроенная функция, и лучше не использовать ее как имя переменной. Есть также более короткие версии, но сначала попробуйте хорошо понять этот тип кода, а затем перейдите к другим путям.

0

Положительный:

reduce(lambda x, y: x + y, [a for a in x if a > 0])/float(len([a for a in x if a > 0])) 

Negative:

reduce(lambda x, y: x + y, [a for a in x if a < 0])/float(len([a for a in x if a < 0])) 

, где есть список я/р

0

Если вы хотите/можете использовать NumPy это тоже очень просто.

import numpy 
def allNumAvg(values): 
    return numpy.average(values) 

def posNumAvg(values): 
    arr_v = np.asarray(values) 
    return numpy.average(arr_v[arr_v>0]) # or do you want the zeros too? 

def nonPosAvg(values): 
    arr_v = np.asarray(values) 
    return numpy.average(arr_v[arr_v<0]) # or do you want the zeros too? 
0

Я на самом деле нравится:

avg = lambda x: sum(x)/float(len(x)) 
print ("all average = %f"%avg(nums)) 
print ("positive average = %f"%avg([x for x in nums if x > 0]) 
print ("non-positive average = %f"%avg([x for x in nums if x <= 0]) 

Но, это, вероятно, «хитрее», чем учитель ищет это задание

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

Расчет сам по себе представляет собой просто сумму списка чисел, деленную на длину списка. Python имеет обе эти функции встроенных (сумма ([список]) и LEN (итератор)):

sum(x)/float(len(x)) 

Давайте сделаем, что мы делаем разделение с плавающей точкой, чтобы убедиться, что он работает для различных версий питона и различные списки данных.

def avg(x): 
    return (sum(x)/float(len(x))) 

Мне не нравится одной функция строки, так что позволяет инлайн, что с лямбдой и присвоить его название:

avg = lambda x: sum(x)/float(len(x)) 

Тогда просто использовать списковые, чтобы отфильтровать список данных, которые вы проходящие для различных звонки:

[x for x in nums if x > 0] 

Я хочу, чтобы список значений в итератора nums где значение больше, чем 0.

Включить, что в вызове сред и у вас есть:

avg([x for x in nums if x > 0]) 

Мы хотим, чтобы напечатать наши результаты.давайте дадим ему ярлык, пока мы на нем. Там нет необходимости хранить значение во временном месте, давайте просто передать результат вызова для печати:

print ("positive average = %f"%avg([x for x in nums if x > 0]) 

Edit:

Я просто заметил, что вы не хранить список значений, которые вы получил от вашей первой функции. Вы хотите сохранить список значений, а затем начать его обработку различными способами:

print(allNumAvg(numbersList())) 

должно быть:

nums = numbersList() 
print(allNumAvg(nums)) 
Смежные вопросы