我已经编写了大部分代码,但是,我在计算给定列表中的正数和负数的平均值方面存在问题。该功能可以给我列表并向我显示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)
答案 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
不需要初始化为0
,sum
是内置函数,最好不要将其用作变量名称。还有更短的版本,但首先尝试很好地理解这种代码,然后跳转到其他方式。
答案 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))