列表字典处理日期值后合并并随机提取指定数量字典的实现方法
解决方案
没问题,这就帮你搞定这两个需求!我们可以分两步实现:生成原字典的副本并更新'dl'值,然后随机选取指定数量的结果,全程不会改动原始字典。
完整代码示例
from datetime import datetime from dateutil.parser import parse import random # 用于随机选取任务 today = '05/17/18' adict = [ {'taskid':1,'desc':'task1','complexity':5,'dl':'05/28/18'}, {'taskid':2,'desc':'task2','complexity':3,'dl':'05/20/18'}, {'taskid':3,'desc':'task3','complexity':1,'dl':'05/25/18'} ] def conv_tm(t): return datetime.strptime(t,'%m/%d/%y') def days(obj): day = conv_tm(today) dl = conv_tm(obj) dur = (dl-day).days if dur <0: dur = 1 return dur # 1. 生成处理后的新字典列表(不修改原字典) processed_tasks = [ {**task, 'dl': days(task['dl'])} for task in adict ] # 2. 随机选取2个字典并打印 selected_tasks = random.sample(processed_tasks, 2) for task in selected_tasks: print(task)
分步解释
不修改原字典更新'dl'值:
这里用了字典解包{**task, 'dl': days(task['dl'])},它会创建原字典的一个副本,然后覆盖'dl'键的值为计算后的天数。这样原始的adict完全不会被改动,完美符合你的要求。
如果你觉得列表推导式不够直观,也可以用循环的方式实现:processed_tasks = [] for task in adict: new_task = task.copy() # 复制原字典 new_task['dl'] = days(new_task['dl']) # 更新dl值 processed_tasks.append(new_task)随机选取指定数量的字典:
使用random.sample()方法可以从列表中随机选取指定数量的元素,而且不会重复选取。这里我们传入处理后的列表processed_tasks和数量2,就能得到随机的2个任务字典。
示例输出
运行代码后,你会得到类似这样的随机结果(每次运行可能不同):
{'taskid': 1, 'desc': 'task1', 'complexity': 5, 'dl': 11} {'taskid': 3, 'desc': 'task3', 'complexity': 1, 'dl': 8}
内容的提问来源于stack exchange,提问作者DNburtonguster
相关产品推荐
相关产品推荐

