You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:09:18