给出一个嵌套列表,代表不同课程的成绩簿:
gradebooks = [[['Troy', 92], ['Alice', 95]], [['James', 89], ['Charles', 100], ['Bryn', 59]]]
sorted()
函数,编写代码以按课程平均值对课程进行排序。预期的输出是[[['James', 89], ['Charles', 100], ['Bryn', 59]], [['Troy', 92], ['Alice', 95]]]
sorted()
函数,编写代码以按分数降序对每门课程的学生进行排序。预期的输出是[[['Alice', 95], ['Troy', 92]], [['Charles', 100], ['James', 89], ['Bryn', 59]]]
我在遇到这些问题时遇到了麻烦,我尝试使用下面的代码回答第一个问题,但这没用。
sort1 = sorted(gradebooks, key=lambda x : sum(gradebooks[x]) / len(gradebooks[x]))
答案 0 :(得分:1)
首先,您的代码不起作用的原因是:
sort1 = sorted(gradebooks, key=lambda x : sum(gradebooks[x]) / len(gradebooks[x]))
已排序函数的参数key
是一个将列表元素作为参数的函数。因此x
将是[['Troy', 92], ['Alice', 95]]
或[['Charles', 100], ['James', 89], ['Bryn', 59]]
。因此,gradebooks[x]
将导致错误:
TypeError: list indices must be integers or slices, not list
对于第一个问题,您的lambda函数应为:
sort1 = sorted(gradebooks, key=lambda x: sum([grade for _, grade in x]) / len(x))
对于第二个问题,我的想法是:总体而言,这是一个列表理解,在列表理解中,使用sorted
函数来处理每个元素。
sort2 = [sorted(course, key=lambda x: x[1], reverse=True) for course in gradebooks]
答案 1 :(得分:0)
使用:
# sort courses by course mean
sort1 = sorted(gradebooks, key=lambda s: sum(dict(s).values()) / len(s))
# sort students of each course by score in descending order.
sort2 = list(map(lambda s: sorted(s, reverse=True, key=lambda y: y[1]), gradebooks))
print(sort1)
print(sort2)
此打印:
[[['James', 89], ['Charles', 100], ['Bryn', 59]], [['Troy', 92], ['Alice', 95]]]
[[['Alice', 95], ['Troy', 92]], [['Charles', 100], ['James', 89], ['Bryn', 59]]]