计算Python中的正/负数平均值

时间:2015-04-24 14:26:28

标签: python list dictionary key python-3.4

我已经编写了大部分代码,但是,我在计算给定列表中的正数和负数的平均值方面存在问题。该功能可以给我列表并向我显示numallavg,但不适用于正面和负面功能。这是我的全部代码:

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)

4 个答案:

答案 0 :(得分: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不需要初始化为0sum是内置函数,最好不要将其用作变量名称。还有更短的版本,但首先尝试很好地理解这种代码,然后跳转到其他方式。

答案 1 :(得分: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]))

阴性:

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

其中a是i / p列表

答案 2 :(得分: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?

答案 3 :(得分: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])

但是,这可能是更棘手的&#34;比老师正在寻找这项任务

您希望对三组不同(虽然相关)的数据进行相同的计算。这听起来像是时候定义一个函数并多次调用它传递不同的参数。

计算本身只是一个数字列表除以列表长度的总和。 Python具有内置的两个函数(sum([list])和len(iterator)):

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

让我们确保我们进行浮点除法,以确保它适用于不同版本的python和不同的数据列表。

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

我不喜欢一行函数,所以让我们使用lambda内联并将其赋值给名称:

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

然后只使用列表推导来过滤您为不同调用传递的数据列表:

[x for x in nums if x > 0]

我想要迭代器nums中的值列表,其中值大于0。

将其插入到avg的调用中,您有:

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

我们想要打印我们的结果。让我们在它的时候给它一个标签。没有必要将值存储在临时点,让我们只是将调用结果传递给print:

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

编辑:

我刚注意到你没有存储你从第一个函数中获得的值列表。您希望存储值列表,然后以不同方式开始处理它:

print(allNumAvg(numbersList()))

需要:

nums = numbersList()
print(allNumAvg(nums))