有时无法计算加权平均值

时间:2019-12-04 16:40:02

标签: python-3.x

我制作了一个程序,该程序计算加权平均数和要求加权平均数等于我们的偏好。如果我希望平均值等于85,则[[4,72,78],[3,56],[6,93]]和x值等于6(列表中的第一个值是下一个值的权重)权重将不会输出正确的值。

def choice(x):
    c = 0
    Choice = True
    choices = []
    while Choice:
        if choices == []:
            if x != 0:
                fill = "weight of required value"
            else:
                fill = "weight of next values"
        else:
            if x != 0:
                fill = "value of wanted weighted average"
            else:
                fill = "value"
        try:
            c = input("Give {}\n" .format(fill))
        except:
            continue
        if isinstance(c, str):
            if c == "":
                Choice = False
                if choices == []:
                    choices = False
                break
            else:
                try: 
                    choices.append(float(c))
                except:
                    continue
        if x != 0 and len(choices) == x:
            break
        c = 0
    return choices
def av(x):
    c = 0
    alist = x[:]
    alist.pop(0)
    for a in alist:
        c += a*x[0]
    return c
def average(k,args):
    c = 0
    n = 0
    for y in range(len(args)):
        for a in range(len(args)):
            c += (av(args[a]))/2
        for b in range(len(args)):
            n += (args[b][0]*(len(args[b])-1))/2
    if k == 1:
        return ([float("{0:.2f}".format(c/n)),c,n])
    else:
        j = float("{0:.2f}".format(c/n))
        print("Weighted average {} from {}" .format(j,args))
def rmark(q,args):
    alist = average(1,args)
    a = float("{:.2f}" .format((((q[1]*(alist[2]+q[0]))-alist[1])/q[0])))
    print("To get weighted average {}, u have to add the value equal to {} of weight {}" .format(q[1],a,q[0]))
    # return a
Continue = True
list_choices = []
while Continue:
    x = 0
    x = choice(0)
    if isinstance(x, list):
        list_choices.append(x)
    elif x == False:
        break

print(list_choices)
rmark(choice(2),list_choices)
average(0,list_choices)

1 个答案:

答案 0 :(得分:0)

让我为您分解一下。

av函数通过弹出(alist.pop(0))一个元素将列表(x1,x2和x3)的大小减小到1。

因此,len(x1)-1的值为0,这意味着(av(x1) + av(x2) + av(x3))/((x1[0]*(len(x1)-1)) + (x2[0]*(len(x2)-1)) + (x3[0]*(len(x3)-1)))分母中所有乘数的值为0。因此,误差除以零。