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
问题出在两个地方:
- 每次调用都会重置字典:函数内部每次都新建空字典
activities = {},导致每次调用只能返回包含当前活动的字典,之前添加的活动数据完全丢失,根本无法实现累积合并。 - 多余的遍历操作:
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
相关产品推荐
相关产品推荐

