如何基于指定字段计算字典列表中各字典的排名(保留原循环)
按年龄计算字典列表中人物的排名(保留原for循环结构)
完全能保留你给出的for循环结构不变,只需要在循环前先做一次预处理,生成年龄到排名的映射,循环内直接通过映射获取排名即可。
完整实现代码
dicts = [ {'name': 'John', 'age': 23}, {'name': 'Sue', 'age': 29}, {'name': 'Bob', 'age': 29}, {'name': 'Alice', 'age': 25} ] # 预处理:提取所有年龄去重后按降序排序 unique_sorted_ages = sorted({p['age'] for p in dicts}, reverse=True) # 生成年龄到排名的映射,最大年龄对应排名1 age_to_rank = {age: idx + 1 for idx, age in enumerate(unique_sorted_ages)} # 原for循环结构完全保留,只修改age_rank的赋值逻辑 for person in dicts: age_rank = age_to_rank[person['age']] print(f"{person['name']} is age-rank {age_rank}")
代码说明
- 先用集合去重所有年龄,再按降序排序,这样相同年龄的人会获得相同排名(比如示例里的Sue和Bob都是29岁,排名都是1)
- 用字典生成式把每个年龄对应到它的排名,排序后的第一个年龄(最大)对应排名1,依次往后推
- 你原来的for循环结构一点没变,只是把
age_rank = ...的部分换成了从映射里取值
运行输出
John is age-rank 3 Sue is age-rank 1 Bob is age-rank 1 Alice is age-rank 2
如果不需要相同年龄共享排名(哪怕年龄一样,也按排序后的顺序给不同名次),可以用下面的预处理方式:
# 按年龄降序排序所有人物 sorted_people = sorted(dicts, key=lambda x: -x['age']) # 生成人物姓名到排名的映射(假设姓名唯一) name_to_rank = {p['name']: idx + 1 for idx, p in enumerate(sorted_people)} # 循环内这样获取排名 age_rank = name_to_rank[person['name']]
这种方式下,示例里的Sue排1,Bob排2,即使两人年龄相同。
内容的提问来源于stack exchange,提问作者NFeruch - FreePalestine
相关产品推荐
相关产品推荐

