Python如何移除含嵌套字典的字典列表重复项(子列表顺序无关)
Python 嵌套字典列表自定义规则去重
针对User Info这类嵌套字典列表不考虑内部元素顺序的去重需求,核心思路是先将每条记录转换为顺序无关的可哈希唯一标识,再通过集合判重实现去重,不需要手动硬编码每个字段的比对逻辑,通用性更强。
实现步骤
- 编写通用转换函数:递归处理所有嵌套结构,字典按键排序后转键值对元组,列表/元组类型的字段先把内部元素转成可哈希结构,再整体排序后转元组,从根源上消除元素顺序对判重的影响。
- 遍历原始记录列表:为每条记录生成对应的唯一标识,用集合存储已经出现过的标识,未出现过的记录就加入结果列表。
完整代码
def to_hashable(obj): if isinstance(obj, dict): # 字典按键排序,递归处理值,消除键顺序差异 return tuple(sorted((key, to_hashable(val)) for key, val in obj.items())) elif isinstance(obj, (list, tuple)): # 列表/元组先递归处理每个元素,再排序后转元组,消除元素顺序差异 return tuple(sorted(to_hashable(item) for item in obj)) # 字符串、数字等基础可哈希类型直接返回 return obj def dedup_record_list(records): seen = set() res = [] for record in records: record_sign = to_hashable(record) if record_sign not in seen: seen.add(record_sign) res.append(record) return res # 测试原始数据 raw_list = [ {'Name': 'Something XYZ', 'Address': 'Random Address', 'Customer Number': '-', 'User Info': [{'Registration Number': '17002', 'First Name': 'John', 'Middle Name': '', 'Last Name': 'Denver'}, {'Registration Number': '27417', 'First Name': 'Robert', 'Middle Name': '', 'Last Name': 'Patson'}]}, {'Name': 'Something XYZ', 'Address': 'Random Address', 'Customer Number': '-', 'User Info': [{'Registration Number': '27417', 'First Name': 'Robert', 'Middle Name': '', 'Last Name': 'Patson'}, {'Registration Number': '17002', 'First Name': 'John', 'Middle Name': '', 'Last Name': 'Denver'}]} ] print(dedup_record_list(raw_list))
效果说明
运行代码后输出结果和预期完全一致:两条记录虽然User Info内部用户字典的顺序相反,但字段值完全匹配,会被判定为重复,最终结果只保留1条有效记录。
如果后续有需要保留顺序的列表字段(比如操作日志、时间序列类字段),只需要在to_hashable函数里对对应字段做特殊处理,不执行排序直接转元组即可,不需要改动整体去重逻辑。
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

