Python字典列表操作:筛选值最多字典与前3高分字典
Hey,这两个都是Python中处理字典列表的常见场景,我来给你拆解解决方案:
1. 找出键值对数量最多的字典
要搞定这个,核心就是利用字典的len()函数(它直接返回字典的键值对总数),搭配max()函数就能快速定位到目标字典。
举个例子:
dict_list = [{'a': 1}, {'b': 2, 'c': 3}, {'d': 4, 'e': 5, 'f': 6}] # 用lambda表达式把每个字典映射成它的长度,作为max的判断依据 max_kv_dict = max(dict_list, key=lambda x: len(x)) print(max_kv_dict) # 输出: {'d': 4, 'e': 5, 'f': 6}
如果列表里有多个字典的键值对数量相同且都是最大值,max()只会返回列表中第一个符合条件的。要是你想把所有长度最大的字典都找出来,可以这么写:
max_length = max(len(d) for d in dict_list) all_max_dicts = [d for d in dict_list if len(d) == max_length] print(all_max_dicts)
2. 筛选分数最高的前三个字典(提取名字)
针对你给出的学生列表,我们需要先按分数从高到低排序,再取前三个元素,最后提取它们的名字就能得到预期结果。
先看基础实现:
student_list = [{'name': 'A', 'score': 12}, {'name': 'B', 'score': 20}, {'name': 'C', 'score': 11}, {'name': 'D', 'score': 20}, {'name': 'E', 'score': 9}] # 按分数降序排序,sorted是稳定排序——同分数的元素会保持原列表里的相对顺序 sorted_students = sorted(student_list, key=lambda x: x['score'], reverse=True) # 截取前3个,再提取名字 top_three_names = [stu['name'] for stu in sorted_students[:3]] print(top_three_names) # 输出: ['B', 'D', 'A']
不过你预期的结果是[D, B, A],这说明你希望分数相同的情况下,名字按字典序降序排列(D的字典序比B大)。那我们可以调整排序的key为元组,先按分数降序,再按名字降序:
sorted_students = sorted(student_list, key=lambda x: (-x['score'], x['name']), reverse=True) top_three_names = [stu['name'] for stu in sorted_students[:3]] print(top_three_names) # 输出: ['D', 'B', 'A']
这样就完全符合你的预期啦~
内容的提问来源于stack exchange,提问作者PaCi




