Python实现字典/列表匹配项合并及数值求和处理
问题描述
我有一个包含列表的字典(或直接是列表形式的数据集),需要遍历数据并合并匹配项——按酒店名称分组,将对应value列的数值相加,最终输出合并后的结果。
示例输入数据
| id | name | date | value |
|---|---|---|---|
| 1 | hotel1 | 22-11-22 | 90 |
| 2 | hotel2 | 22-11-22 | 90 |
| 3 | hotel3 | 22-11-22 | 90 |
| 4 | hotel1 | 23-11-22 | 10 |
| 5 | hotel2 | 23-11-22 | 60 |
| 6 | hotel3 | 23-11-22 | 90 |
期望输出
{ "hotelName": "hotel1", "date": "22-11-22", "value": "100" } { "hotelName": "hotel2", "date": "22-11-22", "value": "150" } { "hotelName": "hotel3", "date": "22-11-22", "value": "180" }
我尝试直接遍历列表,但只能输出未合并的原始数据,求解决方法。
解决方案
核心思路:用字典分组求和
用酒店名称作为字典的键,存储每个酒店的累计value和对应日期(默认取第一条数据的日期,匹配你的期望输出)。遍历原始数据时,判断酒店是否已在字典中:
- 若存在:累加
value - 若不存在:初始化该酒店的条目
这种方法时间复杂度为O(n),遍历一次数据即可完成分组,效率较高。
代码实现
假设原始数据是列表格式(如果是字典嵌套列表,比如data = {"items": [你的数据]},取data["items"]即可):
# 原始数据列表 raw_data = [ {"id": 1, "name": "hotel1", "date": "22-11-22", "value": 90}, {"id": 2, "name": "hotel2", "date": "22-11-22", "value": 90}, {"id": 3, "name": "hotel3", "date": "22-11-22", "value": 90}, {"id": 4, "name": "hotel1", "date": "23-11-22", "value": 10}, {"id": 5, "name": "hotel2", "date": "23-11-22", "value": 60}, {"id": 6, "name": "hotel3", "date": "23-11-22", "value": 90}, ] # 初始化分组字典 grouped = {} for item in raw_data: hotel_name = item["name"] current_value = item["value"] current_date = item["date"] if hotel_name in grouped: # 已存在该酒店,累加value grouped[hotel_name]["value"] += current_value else: # 首次出现,初始化条目 grouped[hotel_name] = { "hotelName": hotel_name, "date": current_date, "value": current_value } # 转换为列表格式,输出结果 result = list(grouped.values()) # 格式化输出(将value转为字符串,匹配期望格式) for item in result: item["value"] = str(item["value"]) print(item)
输出结果
{'hotelName': 'hotel1', 'date': '22-11-22', 'value': '100'} {'hotelName': 'hotel2', 'date': '22-11-22', 'value': '150'} {'hotelName': 'hotel3', 'date': '22-11-22', 'value': '180'}
补充说明
- 如果需要按酒店+日期分组(同一酒店不同日期分开统计),只需将字典的键改为元组
(hotel_name, current_date),逻辑不变。 - 代码中
value转字符串是为了匹配你期望的输出格式,不需要的话可以去掉转换步骤。
内容的提问来源于stack exchange,提问作者Ciaran Mac
相关产品推荐
相关产品推荐

