如何合并字典相同键的列表值并对重复元素去重
首先,Python 原生字典不允许重复键,你示例中给出的data如果直接定义,后面的重复键会覆盖前面的,最终每个键只会保留最后一次赋值的列表。因此需要先将原始数据调整为支持重复键的存储格式,最通用的是转为键值元组组成的列表。
以下是可实现需求的具体方案:
方案1:基础字典实现(无额外依赖)
该方案可以保留列表元素的首次出现顺序,不需要导入任何三方库:
# 先将原始重复键数据转为元组列表格式 raw_data = [ ("test1", ["data1", "data2"]), ("test1", ["data3", "data4", "data2"]), ("test2", ["1data", "2data"]), ("test2", ["3data", "4data", "2data"]) ] result = {} for key, val_list in raw_data: if key not in result: result[key] = [] for item in val_list: if item not in result[key]: result[key].append(item) print(result) # 输出:{'test1': ['data1', 'data2', 'data3', 'data4'], 'test2': ['1data', '2data', '3data', '4data']}
方案2:用defaultdict简化代码
使用Python标准库的collections.defaultdict可以省去判断键是否存在的步骤,代码更简洁:
from collections import defaultdict raw_data = [ ("test1", ["data1", "data2"]), ("test1", ["data3", "data4", "data2"]), ("test2", ["1data", "2data"]), ("test2", ["3data", "4data", "2data"]) ] result = defaultdict(list) for key, val_list in raw_data: for item in val_list: if item not in result[key]: result[key].append(item) # 按需转为普通字典 result = dict(result) print(result)
方案3:集合去重(适合大数据量场景)
如果不需要严格保留列表元素的出现顺序,用集合去重的效率更高,尤其数据量较大时优势明显:
from collections import defaultdict raw_data = [ ("test1", ["data1", "data2"]), ("test1", ["data3", "data4", "data2"]), ("test2", ["1data", "2data"]), ("test2", ["3data", "4data", "2data"]) ] result = defaultdict(set) for key, val_list in raw_data: result[key].update(val_list) # 将集合转为列表,需要顺序的话可自行添加排序逻辑 result = {k: list(v) for k, v in result.items()} print(result)
内容的提问来源于stack exchange,提问作者Nika110
相关产品推荐
相关产品推荐

