Python中按列表唯一活动值求和并保留对应最新日期
按活动聚合列表的实现方案
针对你提供的元组列表,要按flight这类活动名称聚合,保留对应活动的最新日期及其关联地点,并对数值求和,可以用Python通过字典分组的方式实现,具体步骤和代码如下:
实现思路
- 用字典按活动名称分组,存储每个活动的最新日期、对应地点以及数值总和。
- 遍历原始列表,逐个处理每个元组:
- 若活动未在字典中,直接初始化该活动的记录。
- 若活动已存在,对比当前元组的日期与字典中存储的日期:
- 日期更新的话,替换日期和地点,同时累加数值。
- 日期更早的话,仅累加数值。
- 最后将字典中的记录转换回原格式的元组列表。
代码实现
original_list = [ ('2023-03-15', 'paris', 'flight', 4), ('2023-03-21', 'berlin', 'flight', 2), ('2023-03-01', 'madrid', 'drive', 10), ('2023-03-04', 'madrid', 'cycling', 3), ('2023-03-08', 'rome', 'train', 9), ('2023-03-11', 'amsterdam', 'flight', 5), ('2023-03-14', 'london', 'boat', 1) ] aggregated_data = {} for date, location, activity, val in original_list: if activity not in aggregated_data: # 首次遇到该活动,初始化记录 aggregated_data[activity] = (date, location, val) else: stored_date, stored_loc, total_val = aggregated_data[activity] # 利用YYYY-MM-DD格式的字符串可直接比较日期大小的特性 if date > stored_date: aggregated_data[activity] = (date, location, total_val + val) else: aggregated_data[activity] = (stored_date, stored_loc, total_val + val) # 转换为目标格式的列表 result_list = [(d, loc, act, total) for act, (d, loc, total) in aggregated_data.items()] print(result_list)
运行结果
执行后得到的聚合列表如下:
[ ('2023-03-21', 'berlin', 'flight', 11), ('2023-03-01', 'madrid', 'drive', 10), ('2023-03-04', 'madrid', 'cycling', 3), ('2023-03-08', 'rome', 'train', 9), ('2023-03-14', 'london', 'boat', 1) ]
内容的提问来源于stack exchange,提问作者Zen4ttitude
相关产品推荐
相关产品推荐

