如何用Python/JMESPath按2024年期末成绩对学生列表排序?
按2024年期末成绩排序学生列表的JMESPath解决方案
你可以用JMESPath的sort_by结合过滤表达式实现需求,核心是先从每个学生的grades数组中提取2024年的期末成绩,再以此为依据排序。
JMESPath表达式
升序排序
sort_by(students, &(grades[?year == 2024].final)[0])
降序排序(反转升序结果)
reverse(sort_by(students, &(grades[?year == 2024].final)[0]))
表达式解释
sort_by(students, &...):对students数组执行排序,&用于引用当前遍历到的学生对象,后续表达式是排序依据。grades[?year == 2024]:过滤当前学生的grades数组,仅保留year等于2024的成绩条目。.final:提取过滤后成绩条目的final属性,得到单元素数组(如[85])。[0]:取该数组的第一个元素,即2024年期末成绩,作为排序的键值。
Python中使用JMESPath的示例代码
如果用Python的jmespath库执行表达式,可参考以下代码:
import jmespath # 目标数据 data = { "school": "lame", "students": [ {"id": 1, "name": "Joe", "grades": [{"year": 2024, "final": 85}, {"year": 2023, "final": 73}]}, {"id": 2, "name": "Pedro", "grades": [{"year": 2024, "final": 92}, {"year": 2023, "final": 90}]}, {"id": 3, "name": "Mary", "grades": [{"year": 2024, "final": 88}, {"year": 2023, "final": 70}]} ] } # 升序排序结果 sorted_asc = jmespath.search('sort_by(students, &(grades[?year == 2024].final)[0])', data) # 降序排序结果 sorted_desc = jmespath.search('reverse(sort_by(students, &(grades[?year == 2024].final)[0]))', data) print("升序排序结果:") for student in sorted_asc: print(f"{student['name']}: {student['grades'][0]['final']}") print("\n降序排序结果:") for student in sorted_desc: print(f"{student['name']}: {student['grades'][0]['final']}")
输出结果
升序排序后顺序:
- Joe: 85
- Mary: 88
- Pedro: 92
降序排序后顺序:
- Pedro: 92
- Mary: 88
- Joe: 85
内容的提问来源于stack exchange,提问作者patlv23
相关产品推荐
相关产品推荐

