[英]Dictionaries and loops in Python 3.x
我们有一个小组成绩日志:
log = {
'Alex': [3, 7, 11, 10, 8],
'Ben': [6, 12, 4, 9, 9],
'Сarla': [5, 10, 7, 5, 9]}
输出“最好的学生 X,他的最高分 Y,最低分 Z”
解决方案
我有一本字典,我决定做的第一件事是转换它并通过挂钩每个学生的最高和最低分数来用新的值替换值。 之后,在循环中,我只想遍历每个学生的最高分数并找到最大平均值,并使用它返回字典中与含义相对应的键。 但是发生了我无法弄清楚的错误。 通过循环后,数据被转换为int,无法使用它们。 该怎么办?
代码
log = {
'Alex': [3, 7, 11, 10, 8],
'Ben': [6, 12, 4, 9, 9],
'Carla': [5, 10, 7, 5, 9]}
log.update({"Alex":[min(log["Alex"])] + [max(log["Alex"])],
"Ben":[min(log["Ben"])] + [max(log["Ben"])],
"Carla":[min(log["Carla"])] + [max(log["Carla"])]})
for i,j in log.values():
print(max(i,j))
输出
3 11
4 12
5 10
这就是问题所在, int 对象不是 itarible。 我想找到最大的一对,即max(j) ,我必须通过,但是我怎样才能一次返回一对值,而不仅仅是max(j) 。
这是找到最好的学生的方式:
def by_total_grade(name):
return sum(grades[name])
best_student = max(grades, key=by_total_grade)
完整示例:
grades = {
"Alex": [3, 7, 11, 10, 8],
"Ben": [6, 12, 4, 9, 9],
"Сarla": [5, 10, 7, 5, 9],
}
best_student = max(grades, key=lambda k: sum(grades[k]))
best_grades = grades[best_student]
print(
f"Best student {best_student}, "
f"max score {max(best_grades)}, "
f"min score {min(best_grades)}."
)
输出:
Best student Ben, max score 12, min score 4.
我必须承认,我并不是 100% 清楚你想要实现的目标——无论如何,这是我的尝试(使用最少的 Python 概念并尽可能多地维护你的代码):
log = {
'Alex': [3, 7, 11, 10, 8],
'Ben': [6, 12, 4, 9, 9],
'Carla': [5, 10, 7, 5, 9]}
for key, vs in log.items():
log.update({key: [[min(vs)] + [max(vs)]]})
#log.update({"Alex":[min(log["Alex"])] + [max(log["Alex"])],
# "Ben":[min(log["Ben"])] + [max(log["Ben"])],
# "Carla":[min(log["Carla"])] + [max(log["Carla"])]})
current_max = 0
current_min = 100
best_student = "Unknown"
for name, vs in log.items(): # this retrieves key and value for each entry in the dictionary
mx = vs[1] # why are you comparing the mix with the max of each student? Should this always be j[1]?
mn = vs[0]
if mx > current_max:
current_max, current_min, best_student = mx, mn, name
print("Best student is " + best_student + " his top vote is " + str(current_max) + ". His lowest vote is " + str(current_min))
几点意见:
使用循环来运行日志更新更安全:如果你忘记手动运行 1 个学生的更新,你会遇到麻烦。 循环“确保”这不会发生
为什么,当您运行日志字典的更新时,您会使用列表列表进行更新,其中第一个列表始终包含最小值,第二个列表始终包含最大值? 你不能只使用一个简单的列表来更新,其中第一个元素是最小值,第二个元素是最大值?
log.update({key: [min(vs), max(vs)]})
我不明白为什么,在你的循环中,你检查 2 个数字之间的最大值(我指的是m = max(vs[0])
或max(i, j)
在你的情况下)你已经知道第一个是最小值,第二个是最大值。 如果您应用上一点中描述的更改,这将变成:
m = vs[1]
注意:我修改了代码,以便打印出对最佳学生的最低投票数。 current_max
和current_min
分别用低值和高值初始化,以便循环中的逻辑起作用(如果 2 个数字超出可能的投票范围,第一个学生进程将立即更新current_max
和current_min
)。 您实际上可以初始化current_max=0
,因为我认为这个框架中的投票不能为负
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.