You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

列表字典处理日期值后合并并随机提取指定数量字典的实现方法

解决方案

没问题,这就帮你搞定这两个需求!我们可以分两步实现:生成原字典的副本并更新'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:31:10