Python:将字典列表中的任务优先级重新从0开始编号
问题:重新为任务列表的优先级从0开始编号
给定任务列表:
tasks = [{'priority': 2, 'task': 'math', 'complete_time': 15}, {'priority': 10, 'task': 'french', 'complete_time': 90}, {'priority': 5, 'task': 'geography', 'complete_time': 45}, {'priority': 2, 'task': 'math', 'complete_time': 100}]
需要将优先级从0开始重新编号,最终得到:
[ {'priority':0, 'task':'math', 'complete_time': 15}, {'priority':0, 'task':'math', 'complete_time': 100}, {'priority':1, 'task':'geography', 'complete_time': 45}, {'priority':2, 'task':'french', 'complete_time': 90}, ]
已完成步骤:提取了所有唯一优先级对应的字典集合
tasks_set = list({x['priority']:x for x in tasks}.values())
得到结果:
[{'priority': 2, 'task': 'math', 'complete_time': 100}, {'priority': 10, 'task': 'french', 'complete_time': 90}, {'priority': 5, 'task': 'geography', 'complete_time': 45}]
解决方案
核心思路:先对原优先级按升序排序,建立原优先级到新编号的映射关系,再遍历原列表替换每个任务的优先级值。
步骤1:提取并排序唯一的原优先级
不需要保留完整字典,只提取所有唯一的优先级值并按升序排列:
# 获取所有唯一的原优先级,按升序排列 unique_priorities = sorted({task['priority'] for task in tasks})
执行后unique_priorities为[2,5,10]
步骤2:建立原优先级到新编号的映射
用enumerate生成从0开始的编号,对应排序后的原优先级:
priority_map = {old_p: new_p for new_p, old_p in enumerate(unique_priorities)}
执行后priority_map为{2:0, 5:1, 10:2}
步骤3:更新任务列表的优先级
遍历原列表,替换每个任务的priority字段:
# 方式1:生成新列表(不修改原列表) updated_tasks = [ { 'priority': priority_map[task['priority']], 'task': task['task'], 'complete_time': task['complete_time'] } for task in tasks ] # 方式2:直接修改原列表 for task in tasks: task['priority'] = priority_map[task['priority']]
最终结果
执行后得到的updated_tasks(或修改后的原tasks)即为目标结果:
[ {'priority':0, 'task':'math', 'complete_time': 15}, {'priority':0, 'task':'math', 'complete_time': 100}, {'priority':1, 'task':'geography', 'complete_time': 45}, {'priority':2, 'task':'french', 'complete_time': 90}, ]
内容的提问来源于stack exchange,提问作者user3406207
相关产品推荐
相关产品推荐

