【问题标题】:Taking weighted avg with specific formula用特定公式取加权平均
【发布时间】:2015-04-01 22:00:13
【问题描述】:
infileName="grades.txt"
infile=open(infileName,"r")
outfileName="weightedavg.txt"
outfile=open(outfileName,"w")
for line in infile:
    test=line.strip()
    test=line.split()
    fname=test[0]
    lname=test[1]
    grades=test[3::2]
    weights=test[2::2]
   grades=[int(i) for i in grades]
   weights=[int(i) for i in grades]
   weightedavg=????

加权平均的公式是(weight1*grade1)+(weight2*grade2)...+(weightn+graden)

【问题讨论】:

  • 一切正常,我只是不知道如何计算这个公式

标签: python formula


【解决方案1】:

您可以将两个列表压缩在一起,将每个对应的元素相乘并求和:

print(sum(a*b for a,b in zip(weights, grades)))

这假定两个列表的长度相同,但我想它们是或者你的逻辑是错误的。

我不确定我是否遵循了你的所有代码,因为你似乎在循环但没有在循环之外存储成绩或权重,所以我假设你想对每一行都这样做:

infileName="grades.txt"
outfileName="weightedavg.txt"

with open(infileName) as infile, open(outfileName,"w") as outfile:
    for line in infile:
        test = line.split()
        grades = map(int,test[3::2])
        weights =  map(int,test[2::2])  
        wghtd_avg = sum(a*b for a,b in zip(weights,grades))

如果除了计算之外您不需要成绩或权重,您可以使用mapitertools.islice

from itertools import islice

with open(infileName) as infile, open(outfileName,"w") as outfile:
    for line in infile:
        test = line.split()
        it = map(int, islice(test, 2, None)) # itertools.imap for python2
        print(sum(a*b for a,b in zip(it, it)))

使用with 将自动关闭您的文件,如果您使用的是python2,请使用itertools.imapitertools.izip

【讨论】:

  • 那不只是print 一个generator 对象吗?
  • 现在添加一个) 来关闭print 调用,并添加一个" 来结束字符串"weightedavg.txt。 :)
【解决方案2】:

生成器表达式(您可以将其视为隐含的列表推导式)可能是最“Pythonic”的解决方案:

grades = [83, 92, 96]
weights = [0.4, 0.4, 0.2]
weighted_avg = sum(x * y for x,y in zip(grades, weights))

最后,weighted_avg == 89.2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2016-05-23
    相关资源
    最近更新 更多