2015-04-01 61 views
1
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=???? 

用于加权平均的公式是(重量1 * grade1)+(重量2 * grade2)... +(+的Weightn园艺)采取加权平均用特定式

+0

每一件事情的作品,我只是不不知道如何计算这个公式 – 2015-04-01 22:01:19

回答

1

生成表达式(你能想到的一个隐含的列表理解的)可能是最“Python化”的解决方案:

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

3

可以压缩这两个列表一起,乘每个对应的元素之和:

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将自动关闭您的文件,使用itertools.imapitertools.izip如果你正在使用python2。

+0

这不就是'打印'发电机'对象吗? – TigerhawkT3 2015-04-01 22:05:24

+1

现在添加'''关闭'print'调用,'''结束字符串''weightedavg.txt'。 :) – TigerhawkT3 2015-04-01 22:20:15

+1

@ TigerhawkT3,全部完成和撒灰;) – 2015-04-01 22:23:19