【发布时间】:2018-10-07 17:31:09
【问题描述】:
我正在上初级编码课程,我似乎无法将我所学的基础知识转化为一个工作程序,其中包含如此复杂的列表。我应该使用哪些函数来执行此操作?
在这一点上,我们还没有讨论导入任何额外的功能(numpy 等),我知道人们经常使用 lambda(虽然我不太了解它的作用),但在本课程中还没有介绍。
#This is an example of the structure of a student dictionary
#They have an id number
#They have a first name, last name and a list of assignments
#Assignments are tuples of an assignment name and grade
#The grade is a 4 point scale from 0 to 4
'''
student_list = [{'id': 12341, 'first_name': 'Alice', 'last_name': 'Anderson',
'assignments': [('assignment_1', 0), ('assignment_2', 2), ('assignment_3', 4)]},
{'id': 12342, 'first_name': 'Boris', 'last_name': 'Bank',
'assignments': [('assignment_1', 1), ('assignment_2', 3), ('assignment_3', 0)]},
{'id': 12343, 'first_name': 'Carl', 'last_name': 'Cape',
'assignments': [('assignment_1', 2), ('assignment_2', 4), ('assignment_3', 1)]},
{'id': 12344, 'first_name': 'Didi', 'last_name': 'Dawson',
'assignments': [('assignment_1', 3), ('assignment_2', 0), ('assignment_3', 2)]},
{'id': 12345, 'first_name': 'Ed', 'last_name': 'Enders',
'assignments': [('assignment_1', 4), ('assignment_2', 1), ('assignment_3', 3)]}]
#This function should return a list of the n student dictionaries with the
#highest grades on the assignment passed in as assignment name
#If there is a tie then it is broken by returning the student(s) with the
#lowest id number(s)
def highest_n_grades(students, assignment_name, n):
编辑
对不起,我不想得到答案。我看那看起来如何。我觉得我已经写出并删除了一百万件事,这是我的问题。我什至无法开始。
我希望找到一个正确的方向,比如哪些命令可以获取最高分等。到目前为止,我真正拥有的只是:
def highest_n_grades(student_list):
for s in student_list:
for assignment_name, grade in s['assignments']:
if int(grade) >= 4:
print(assignment_name, grade)
highest_n_grades(student_list)
但我知道这甚至不能让我真正开始。它没有三个输入,也不是在寻找最大值,而是在寻找手动输入的值 4,甚至还没有接近与学生姓名绑定或制作另一个列表。
编辑 2
还尝试了一个错误,我试图对字典而不是列表进行排序。
def highest_n_grades(student_list, assignment_name):
for s in student_list:
for assignment_name in s['assignments'][1]:
s['assignments'][1] = assignment_name
s.sort(key=assignment_name)
print(student_list)
highest_n_grades(student_list, assignment_name='assignment_1' )
编辑 3
好的,我可能取得了一些进展?
newlist2 = sorted(newlist, key=lambda k: k['assignments'][0], reverse = True)
newlist3 = sorted(newlist, key=lambda k: k['assignments'][1], reverse = True)
newlist4 = sorted(newlist, key=lambda k: k['assignments'][2], reverse = True)
这些似乎是按任务排序的。我不明白 lambda 在做什么,但我至少可以生成一个最高等级的列表。我认为这是一个婴儿步骤。
编辑 4
这是我创建的一个函数。它似乎得到了我想要的东西,它输出了最高的 3 名学生,但它打印了 5 次?我知道这不是很灵活,但这是一个开始。
def highest_n_grades(student_list, n):
for s in student_list:
newlist = sorted(student_list, key=lambda k: k['assignments'][0], reverse=True)
print(newlist[:n])
highest_n_grades(student_list, 3)
输出:
[{'id': 12345, 'first_name': 'Ed', 'last_name': 'Enders', 'assignments': [('assignment_1', 4), ('assignment_2', 1), ('assignment_3', 3)]}, {'id': 12344, 'first_name': 'Didi', 'last_name': 'Dawson', 'assignments': [('assignment_1', 3), ('assignment_2', 0), ('assignment_3', 2)]}, {'id': 12343, 'first_name': 'Carl', 'last_name': 'Cape', 'assignments': [('assignment_1', 2), ('assignment_2', 4), ('assignment_3', 1)]}]
[{'id': 12345, 'first_name': 'Ed', 'last_name': 'Enders', 'assignments': [('assignment_1', 4), ('assignment_2', 1), ('assignment_3', 3)]}, {'id': 12344, 'first_name': 'Didi', 'last_name': 'Dawson', 'assignments': [('assignment_1', 3), ('assignment_2', 0), ('assignment_3', 2)]}, {'id': 12343, 'first_name': 'Carl', 'last_name': 'Cape', 'assignments': [('assignment_1', 2), ('assignment_2', 4), ('assignment_3', 1)]}]
[{'id': 12345, 'first_name': 'Ed', 'last_name': 'Enders', 'assignments': [('assignment_1', 4), ('assignment_2', 1), ('assignment_3', 3)]}, {'id': 12344, 'first_name': 'Didi', 'last_name': 'Dawson', 'assignments': [('assignment_1', 3), ('assignment_2', 0), ('assignment_3', 2)]}, {'id': 12343, 'first_name': 'Carl', 'last_name': 'Cape', 'assignments': [('assignment_1', 2), ('assignment_2', 4), ('assignment_3', 1)]}]
[{'id': 12345, 'first_name': 'Ed', 'last_name': 'Enders', 'assignments': [('assignment_1', 4), ('assignment_2', 1), ('assignment_3', 3)]}, {'id': 12344, 'first_name': 'Didi', 'last_name': 'Dawson', 'assignments': [('assignment_1', 3), ('assignment_2', 0), ('assignment_3', 2)]}, {'id': 12343, 'first_name': 'Carl', 'last_name': 'Cape', 'assignments': [('assignment_1', 2), ('assignment_2', 4), ('assignment_3', 1)]}]
[{'id': 12345, 'first_name': 'Ed', 'last_name': 'Enders', 'assignments': [('assignment_1', 4), ('assignment_2', 1), ('assignment_3', 3)]}, {'id': 12344, 'first_name': 'Didi', 'last_name': 'Dawson', 'assignments': [('assignment_1', 3), ('assignment_2', 0), ('assignment_3', 2)]}, {'id': 12343, 'first_name': 'Carl', 'last_name': 'Cape', 'assignments': [('assignment_1', 2), ('assignment_2', 4), ('assignment_3', 1)]}]
【问题讨论】:
-
您好,仅仅发布您的家庭作业可能对您没有任何帮助。至少要付出一些努力,让你的程序运行起来,即使它什么也没做。然后你可以开始循环数据并输出它,只是为了开始。任何关于循环的教程都可以,例如python-course.eu/python3_for_loop.php
-
你试过什么?你能提供一个minimal reproducible example吗?这似乎是一个家庭作业,这并不是真正的“这是我的家庭作业要求,请提供一个完整的工作示例”类型的网站。请发布您尝试过的内容,以便我们能够POINT帮助您朝着正确的方向前进。
-
对不起。我不是想得到答案。我看那看起来如何。我觉得我已经写出并删除了一百万件事,这是我的问题。我什至在开始时都遇到了麻烦....我希望在正确的方向上找到一个点,也许哪些命令可以获取最高成绩等。到目前为止,我真正拥有的只是 defhighest_n_grades(student_list): for s in student_list: for assignment_name, grade in s['assignments']: if int(grade) >= 4: print(assignment_name,grade) highest_n_grades(student_list)
-
好的,一个非常有用的策略是让您开始打印值。例如打印出
student_list[0]然后查看student_list[0]['id']的输出然后查看student_list[0]['assignments'][0]的输出这将帮助您了解如何获取您需要的数据。而且在你的循环中,你会知道你正在处理哪些值 -
@tsb 我建议对
student_list进行排序,这是一个list的字典。具体来说,根据传入的赋值名称按降序排序(因此我们将在排序函数中指定key属性)。你现在能看出这种方法背后的想法了吗?
标签: python