Python中如何对比两个列表并捕获CSV列表不存在于数据库列表的差异值
列表对比校验实现方案
核心优化思路
- 优先将数据量更大的数据库响应列表转换为
set集合:集合的成员查询时间复杂度为O(1),远优于列表遍历查询的O(n),数据量越大性能提升越明显 - 若列表元素为不可哈希的嵌套结构(如字典、子列表),需要先将元素转换为可哈希格式后再存入集合
基础版代码(元素为可哈希类型:数字、字符串、元组等)
# 数据库响应返回的列表 db_response_list = ["user1", "user2", "user3", "user4", "user5"] # 从CSV读取的列表 csv_read_list = ["user1", "user3", "user6"] # 转换为集合加速查询 db_dataset = set(db_response_list) # 筛选出CSV存在但数据库不存在的条目 unmatched_items = [item for item in csv_read_list if item not in db_dataset] # 输出校验结果 if len(unmatched_items) == 0: print("校验通过:CSV所有数据均已正确入库") else: print(f"校验失败,共{len(unmatched_items)}条CSV数据未在数据库中查到:") for item in unmatched_items: print(item)
进阶版代码(元素为字典类型的业务场景)
如果两个列表的单条元素都是键值对格式的字典(比如对应数据库的一行字段、CSV的一行数据),需要先把字典转成可哈希的元组:
def convert_dict_to_hashable(input_dict): # 按字典key排序后转元组,保证内容相同的字典哈希值一致 return tuple(sorted(input_dict.items())) # 数据库返回的字典列表 db_response_list = [ {"id": 1, "name": "张三", "age": 20}, {"id": 2, "name": "李四", "age": 22}, {"id": 3, "name": "王五", "age": 21} ] # CSV读取的字典列表 csv_read_list = [ {"id": 1, "name": "张三", "age": 20}, {"id": 4, "name": "赵六", "age": 23} ] # 转换数据库集合 db_hash_set = set(convert_dict_to_hashable(item) for item in db_response_list) # 筛选未匹配条目 unmatched_items = [item for item in csv_read_list if convert_dict_to_hashable(item) not in db_hash_set] # 输出结果 if not unmatched_items: print("校验通过:CSV所有数据均已正确入库") else: print(f"校验失败,未匹配的条目如下:") for item in unmatched_items: print(item)
注意事项
校验前建议先做数据标准化处理:比如字符串统一大小写、去掉前后空格、空值统一转换为
None、数值统一格式等,避免因为格式不一致导致的误判。
内容的提问来源于stack exchange,提问作者Bruno Lorena
相关产品推荐
相关产品推荐

