时刻三七 发表于 2020-4-27 22:11:52

请问想实现以下目的,代码应该怎么写

1.所有投标金额的算术平均值记为A1;
2.凡是超过A1范围的金额剔除;
3.计算剩下投标金额的算术平均值记为A2;
4.输出投标得分=100-100*n*abs(投标金额-A2)/A2,当投标金额大于A2时,n=1,反之n=0.75

我写的代码是这样的,显然不能运行,请大家帮忙看看有哪些问题,谢谢
def fenshu(baojia):
    leng = str(baojia)
    changdu1 = leng.count()
    baojia2 = []
    n = 0
    for A0 in range(changdu1):
      A0 += A0
      A1 = A0 % changdu1
      A11 = A1*0.8
      A12 = A1*1.2
      if A0 > A12 or A0 < A11:
            none
      else:
            baojia2.append(a0)
      changdu2 = baojia2.count()
      for A02 in range(changdu2):
            A02 += A02
            A2 = A02 % changdu2
            if A02 > A2:
                n =1
            else:
                n=0.75
      AO3 = abs(A02 - A2)
      print('报价得分为:%d' %(100-100*n*A03/A2))

txxcat 发表于 2020-4-27 23:41:35

本帖最后由 txxcat 于 2020-4-28 11:00 编辑

问题实在太多,只好推倒重来:
def fenshu(*baojia):            #加*才能接受多参数
    A1=sum(baojia)/len(baojia)    #计算金额平均数
    bj_min=A1*0.8
    bj_max=A1*1.2
    newbaojia=[]
    for i in baojia:            #剔除不合条件的金额
      if bj_min<=i<=bj_max:
            newbaojia.append(i)
    A2=sum(newbaojia)/len(newbaojia)    #计算符合条件的金额平均数
    for j in newbaojia:
      n=1 if j>A2 else 0.75         #计算n值
      print('投标金额:%d 报价得分:%d' % (j,(100-100*n*abs(j-A2)/A2)))

#测试
fenshu(8999,9999,12000,12500,13000,13888,14000,16000)

时刻三七 发表于 2020-4-28 20:54:26

txxcat 发表于 2020-4-27 23:41
问题实在太多,只好推倒重来:

谢谢你的回答,还有个问题麻烦再帮解决一下
现在这个函数只能输入整数,而且最好输出的分数也是整数,请问要在哪里改动可以接受浮点数

txxcat 发表于 2020-4-28 21:04:11

时刻三七 发表于 2020-4-28 20:54
谢谢你的回答,还有个问题麻烦再帮解决一下
现在这个函数只能输入整数,而且最好输出的分数也是整数,请 ...

输入没有限制,浮点数也可以输入,输出也是浮点数,只是最后print使用了整数格式,改一改最后的格式就可以了:
def fenshu(*baojia):            #加*才能接受多参数
    A1=sum(baojia)/len(baojia)    #计算金额平均数
    bj_min=A1*0.8
    bj_max=A1*1.2
    newbaojia=[]
    for i in baojia:            #剔除不合条件的金额
      if bj_min<=i<=bj_max:
            newbaojia.append(i)
    A2=sum(newbaojia)/len(newbaojia)    #计算符合条件的金额平均数
    for j in newbaojia:
      n=1 if j>A2 else 0.75         #计算n值
      print('投标金额:%.2f 报价得分:%.2f' % (j,(100-100*n*abs(j-A2)/A2)))         #假设输出2位小数

#测试
fenshu(89.99,99.99,120.5,125.48,130.80,138.88,140.6,166.66)

时刻三七 发表于 2020-4-28 21:07:39

txxcat 发表于 2020-4-27 23:41
问题实在太多,只好推倒重来:

我输入一下值时,fenshu(199999,1983243,1897543,179999)
报出如下错误:ZeroDivisionError: division by zero

时刻三七 发表于 2020-4-28 21:35:37

txxcat 发表于 2020-4-28 21:04
输入没有限制,浮点数也可以输入,输出也是浮点数,只是最后print使用了整数格式,改一改最后的格式就可 ...

明白了,还有一点,如果我想读取一个文件里的报价,我应该怎么改呢,
f = open(r'E:\a.txt', encoding='utf-8')    # 加上 encoding 参数
baojia = str(f.read())
我现在是这样写的,但读取的类型好像不对

txxcat 发表于 2020-4-28 21:54:57

时刻三七 发表于 2020-4-28 21:35
明白了,还有一点,如果我想读取一个文件里的报价,我应该怎么改呢,
f = open(r'E:\a.txt', encoding=' ...

你读出来的就是字符串,需要分解然后转成数字,具体怎么写要看文件格式。

时刻三七 发表于 2020-4-29 21:23:24

txxcat 发表于 2020-4-28 21:54
你读出来的就是字符串,需要分解然后转成数字,具体怎么写要看文件格式。

f = open(r'E:\a.txt', encoding='utf-8')    # 加上 encoding 参数
b = list(f.read())
baojia = []
for each in b:
    if each != ' ':
      baojia.append(each)

请问还有什么问题吗
我的文本格式就是第一个报价 空格 第二个报价

txxcat 发表于 2020-4-29 21:25:09

时刻三七 发表于 2020-4-28 21:07
我输入一下值时,fenshu(199999,1983243,1897543,179999)
报出如下错误:ZeroDivisionError: division b ...

金额相差太悬殊,1和4是十万级,2和3是百万级,平均之后全都不符合标准,所有报除0错,我猜你应该是金额输错了,不过在代码里加个判断比较好:
def fenshu(*baojia):            #加*才能接受多参数
    A1=sum(baojia)/len(baojia)    #计算金额平均数
    bj_min=A1*0.8
    bj_max=A1*1.2
    newbaojia=[]
    for i in baojia:            #剔除不合条件的金额
      if bj_min<=i<=bj_max:
            newbaojia.append(i)
    if newbaojia:
      A2=sum(newbaojia)/len(newbaojia)    #计算符合条件的金额平均数
      for j in newbaojia:
            n=1 if j>A2 else 0.75         #计算n值
            print('投标金额:%.2f 报价得分:%.2f' % (j,(100-100*n*abs(j-A2)/A2)))         #假设输出2位小数
    else:
      print('没有符合条件的金额,请检查金额。')

txxcat 发表于 2020-4-29 21:54:27

本帖最后由 txxcat 于 2020-4-30 08:03 编辑

{:10_277:}

txxcat 发表于 2020-4-29 22:00:41

时刻三七 发表于 2020-4-29 21:23
f = open(r'E:\a.txt', encoding='utf-8')    # 加上 encoding 参数
b = list(f.read())
baojia = []


def fenshu(baojia):            #去掉*,因为参数本身就是一个数组
    A1=sum(baojia)/len(baojia)    #计算金额平均数
    bj_min=A1*0.8
    bj_max=A1*1.2
    newbaojia=[]
    for i in baojia:            #剔除不合条件的金额
      if bj_min<=i<=bj_max:
            newbaojia.append(i)
    if newbaojia:
      A2=sum(newbaojia)/len(newbaojia)    #计算符合条件的金额平均数
      for j in newbaojia:
            n=1 if j>A2 else 0.75         #计算n值
            print('投标金额:%.2f 报价得分:%.2f' % (j,(100-100*n*abs(j-A2)/A2)))         #假设输出2位小数
    else:
      print('没有符合条件的金额,请检查金额。')

bj = []
baojia = []
with open(r'E:\a.txt', encoding='utf-8') as f:
    for i in f:                   #读取每一行
      bj.extend(i.split())      #把每行数据分解
if bj:                            #如果为空,说明报价文件错误
    for j in bj:
         baojia.append(float(j))#转换成数字
    fenshu(baojia)
else:
    print('请检查报价文件。')
页: [1]
查看完整版本: 请问想实现以下目的,代码应该怎么写