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

Python中合并同键字典的对象列表:代码问题排查

问题分析与解决方案

需求说明

我有一个由多个字典组成的列表,每个字典的键为活动名称,值是单个活动对象的列表,原始数据如下:

{'Kitchen_Activity': [date= 2009-10-16, start time= 08:45:38, end time= 08:58:52, duration= 0 days 00:13:14 ]}
{'Chores': [date= 2009-10-16, start time= 08:59:02, end time= 09:14:47, duration= 0 days 00:15:45 ]}
{'Kitchen_Activity': [date= 2009-10-16, start time= 09:14:40, end time= 09:14:54, duration= 0 days 00:00:14 ]}
{'Chores': [date= 2009-10-16, start time= 09:30:40, end time= 09:58:54, duration= 0 days 00:28:14 ]}
{'Kitchen_Activity': [date= 2009-10-16, start time= 10:14:40, end time= 10:14:54, duration= 0 days 00:00:14 ]}
{'Shower': [date= 2009-10-16, start time= 11:14:40, end time= 11:40:40, duration= 0 days 00:26:00 ]}

期望将相同活动名称对应的对象合并到同一个列表中,得到如下结果:

{'Kitchen_Activity': [date= 2009-10-16, start time= 08:45:38, end time= 08:58:52, duration= 0 days 00:13:14 ], [date= 2009-10-16, start time= 09:14:40, end time= 09:14:54, duration= 0 days 00:00:14 ], [date= 2009-10-16, start time= 10:14:40, end time= 10:14:54, duration= 0 days 00:00:14 ]}
{'Chores': [date= 2009-10-16, start time= 08:59:02, end time= 09:14:47, duration= 0 days 00:15:45 ], [date= 2009-10-16, start time= 09:30:40, end time= 09:58:54, duration= 0 days 00:28:14 ]}
{'Shower': [date= 2009-10-16, start time= 11:14:40, end time= 11:40:40, duration= 0 days 00:26:00 ]}

现有代码的问题

我编写的generateActivity函数无法得到期望结果,代码如下:

def generateActivity(self, date, name, ts, te, dur):
        activities = {}
        activity = Activity().generateInstance(date, name, ts, te, dur)

        if activity.name not in activities.keys():
            activities[activity.name] = []
            activities[activity.name].append(activity)
        else:
            for key, item in activities.items():
                if key == activity.name:
                    item.append(activity)
        return activities

问题出在两个地方:

  1. 每次调用都会重置字典:函数内部每次都新建空字典activities = {},导致每次调用只能返回包含当前活动的字典,之前添加的活动数据完全丢失,根本无法实现累积合并。
  2. 多余的遍历操作:else分支里遍历整个字典的操作完全没必要,既然已经确认activity.name在字典的键中,直接通过键访问对应的列表并追加元素即可,无需遍历。

修正后的代码

把activities改为类的实例变量,确保每次调用都能在同一个字典中累积数据,同时简化逻辑:

def generateActivity(self, date, name, ts, te, dur):
    # 初始化实例变量,确保首次调用时创建空字典
    if not hasattr(self, 'activities'):
        self.activities = {}
    activity = Activity().generateInstance(date, name, ts, te, dur)
    
    # 直接通过活动名称操作对应列表,无需多余判断和遍历
    if activity.name not in self.activities:
        self.activities[activity.name] = []
    self.activities[activity.name].append(activity)
    return self.activities

内容的提问来源于stack exchange,提问作者accipigna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:25:39