Python 通过列表理解返回元组

Python 通过列表理解返回元组,python,tuples,list-comprehension,Python,Tuples,List Comprehension,我试图返回学生的名字和他们的分数总和,以获得最高的总分数。 我的代码在下面 代码: 输出: [('Andrew', [56, 79, 90, 22, 50]), ('Nisreen', [88, 62, 68, 75, 78]), ('Alan', [95, 88, 92, 85, 85]), ('Chang', [76, 88, 85, 82, 90]), ('Tricia', [99, 92, 95, 89, 99])] (('Tricia', 474),) 我有两个问题。。。 首先,为什

我试图返回学生的名字和他们的分数总和,以获得最高的总分数。 我的代码在下面

代码:

输出:

[('Andrew', [56, 79, 90, 22, 50]), ('Nisreen', [88, 62, 68, 75, 78]), ('Alan', [95, 88, 92, 85, 85]), ('Chang', [76, 88, 85, 82, 90]), ('Tricia', [99, 92, 95, 89, 99])]
(('Tricia', 474),)
我有两个问题。。。 首先,为什么输出不仅仅是('Tricia',474)(为什么是额外的逗号和括号集)? 第二,有没有更好的办法


提前谢谢你

您创建了一个只包含一个元组的列表,当传递到
tuple
时,该列表将生成一个只包含一个元组的元组

您真正想要的是名称/总和对列表的最大值,最大值被定义为具有最大总和的对

>>> max([(name, sum(grades)) for name, grades in list_of_student_grades], key=lambda x: x[1])
('Tricia', 474)

一种可能的替代方法是简单地计算具有最高总和的学生的姓名,然后重新计算其总和以构建所需的元组。把特里西亚的成绩计算两次是多余的,我不知道这看起来是否更好,但我觉得这很有趣,值得一提

>>> def compute_sum(name):
...  return sum(student_grades[name])
...
>>> (name:=max(student_grades, key=compute_sum), compute_sum(name))
('Tricia', 474)

sum_of_points=[(k,sum(student_grades[k])for k in student_grades.keys()]
这将返回元组列表,其中第一项为学生姓名,下一项为点之和。一行解决方案:
tuple(map(lambda x:max(x.items(),key=lambda v:v[1]),[dict(zip(student_grades.keys(),map(sum,student_grades grades.value)())))]))
将输出作为
(('Tricia',474),)
返回最大值确实比返回第一个匹配最大值条件的项要好……我刚刚输入了这个精确的解决方案,你比我快了一步——是的,最初的实现是一种非常迂回的重新实现
max
:)
>>> def compute_sum(name):
...  return sum(student_grades[name])
...
>>> (name:=max(student_grades, key=compute_sum), compute_sum(name))
('Tricia', 474)