如果没有for循环,如何实现计算加权平均值
How to implement about calculating weighted average if it's without for loop
这是我的代码如下:
students = [{'name': 'Tom',
'subjects': {'math': 50,
'english': 100,
'science': 72}},
{'name': 'Alex',
'subjects': {'math': 100,
'english': 90,
'science': 95}}]
weighting_coefficient = {'math': 2,
'english': 10,
'science': 8}
total = sum(weighting_coefficient.values())
for index, student in enumerate(students):
subjects = student['subjects']
weighting_score = 0
for subject, score in subjects.items():
weighting_score += weighting_coefficient[subject] * score
students[index]['weighted_average'] = float(weighting_score)/total
print students
结果:
[{'name': 'Tom',
'subjects': {'english': 100, 'math': 50, 'science': 72},
'weighted_average': 83.8},
{'name': 'Alex',
'subjects': {'english': 90, 'math': 100, 'science': 95},
'weighted_average': 93.0}]
我确定可以完成计算,但是如果我不使用foor-loop
来实现代码是否可以实现?
感谢@Kevin Guan 的宝贵建议(帮助我提高了自己的水平"Python career")
按照建议使用列表理解:
students = [{'name': 'Tom',
'subjects': {'math': 50,
'english': 100,
'science': 72}},
{'name': 'Alex',
'subjects': {'math': 100,
'english': 90,
'science': 95}}]
weighting_coefficient = {'math': 2,
'english': 10,
'science': 8}
total = sum(weighting_coefficient.values())
for student in students:
student['weighted_average'] = float( sum( [student['subjects'][subj] * weighting_coefficient[subj] for subj in student['subjects'].keys() ] ) ) / total
print students
代码起初看起来很乱,但您可以创建更多变量来保存关键信息(并使 weighting_coefficients
更短)。
我已经用原始数据集和一个额外的数据集进行了测试(此处未包括但结果与使用 OP 的方法和我的方法匹配)。
这是我的代码如下:
students = [{'name': 'Tom',
'subjects': {'math': 50,
'english': 100,
'science': 72}},
{'name': 'Alex',
'subjects': {'math': 100,
'english': 90,
'science': 95}}]
weighting_coefficient = {'math': 2,
'english': 10,
'science': 8}
total = sum(weighting_coefficient.values())
for index, student in enumerate(students):
subjects = student['subjects']
weighting_score = 0
for subject, score in subjects.items():
weighting_score += weighting_coefficient[subject] * score
students[index]['weighted_average'] = float(weighting_score)/total
print students
结果:
[{'name': 'Tom',
'subjects': {'english': 100, 'math': 50, 'science': 72},
'weighted_average': 83.8},
{'name': 'Alex',
'subjects': {'english': 90, 'math': 100, 'science': 95},
'weighted_average': 93.0}]
我确定可以完成计算,但是如果我不使用foor-loop
来实现代码是否可以实现?
感谢@Kevin Guan 的宝贵建议(帮助我提高了自己的水平"Python career")
按照建议使用列表理解:
students = [{'name': 'Tom',
'subjects': {'math': 50,
'english': 100,
'science': 72}},
{'name': 'Alex',
'subjects': {'math': 100,
'english': 90,
'science': 95}}]
weighting_coefficient = {'math': 2,
'english': 10,
'science': 8}
total = sum(weighting_coefficient.values())
for student in students:
student['weighted_average'] = float( sum( [student['subjects'][subj] * weighting_coefficient[subj] for subj in student['subjects'].keys() ] ) ) / total
print students
代码起初看起来很乱,但您可以创建更多变量来保存关键信息(并使 weighting_coefficients
更短)。
我已经用原始数据集和一个额外的数据集进行了测试(此处未包括但结果与使用 OP 的方法和我的方法匹配)。