使用lambda对嵌套列表进行排序

时间:2020-04-18 07:39:32

标签: python

给出一个嵌套列表,代表不同课程的成绩簿:

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]))

2 个答案:

答案 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]]]