Py学习  »  Python

Python 3中的字典和循环。十、

Ben • 2 年前 • 639 次点击  

我们有一个小组成绩记录:

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。我想找一对最大的,就是 麦克斯(j) ,我必须通过,但是我怎么能一次返回一对值,而不仅仅是 麦克斯(j) .

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129993
 
639 次点击  
文章 [ 2 ]  |  最新文章 2 年前
Mateen Ulhaq
Reply   •   1 楼
Mateen Ulhaq    2 年前

这就是一个人如何找到最好的学生:

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.
nikeros
Reply   •   2 楼
nikeros    2 年前

我必须承认,我并不是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)]})
    
  • 我不明白为什么在你的循环中,你检查两个数字之间的最大值是多少(我指的是 m = max(vs[0]) max(i, j) 在你的情况下)你在哪里 已经知道了 第一个是最小值,第二个是最大值。如果应用上一点中所述的更改,这将变成:

    m = vs[1] 
    

笔记 :我修改了代码,以便打印出最佳学生的最低投票数。 current_max current_min 分别用低值和高值初始化,以便循环中的逻辑工作(如果两个数字超出可能的投票范围,第一个学生进程将立即更新这两个数字) 最大电流 当前_min ).你本来可以初始化 current_max=0 考虑到我认为在这个框架内的投票不能是负面的