Python实现字典内部列表值去重 支持任意字段通用配置
字典嵌套列表通用去重方案
本方案可对任意深度嵌套的字典、列表混合结构做自动去重,无需针对特定字段单独配置,可覆盖所有字段场景。
输入数据示例
{'Customer_Number': 90617174, 'Email': [{'Email_Type': 'Primary', 'Email': ['saman.zonouz@rutgers.edu', 'saman.zonouz@rutgers.edu']}], 'Phone_Number': [{'Phone_Type': 'Mobile', 'Phone': [12177218280, 12177218280]}]}
期望输出示例
{'Customer_Number': 90617174, 'Email': [{'Email_Type': 'Primary', 'Email': ['saman.zonouz@rutgers.edu']}], 'Phone_Number': [{'Phone_Type': 'Mobile', 'Phone': [12177218280]}]}
原有代码问题说明
你之前编写的代码仅遍历了字典的最外层键,没有处理内部嵌套的子字典、列表结构,因此无法实现内层列表的去重效果。
通用去重实现代码
def deduplicate_nested_structure(obj): # 处理字典类型 if isinstance(obj, dict): return {key: deduplicate_nested_structure(value) for key, value in obj.items()} # 处理列表类型 elif isinstance(obj, list): # 先递归处理列表内每个元素 processed_items = [deduplicate_nested_structure(item) for item in obj] # 尝试对可哈希元素去重,保留原始顺序 try: # 利用Python3.7+字典插入有序特性去重 return list(dict.fromkeys(processed_items)) except TypeError: # 存在不可哈希元素(如子字典)时返回处理后的列表,不做外层去重 return processed_items # 其他基础类型直接返回 else: return obj
使用示例
# 输入数据 original_dic = {'Customer_Number': 90617174, 'Email': [{'Email_Type': 'Primary', 'Email': ['saman.zonouz@rutgers.edu', 'saman.zonouz@rutgers.edu']}], 'Phone_Number': [{'Phone_Type': 'Mobile', 'Phone': [12177218280, 12177218280]}]} # 调用去重方法 deduplicated_dic = deduplicate_nested_structure(original_dic) # 输出结果 print(deduplicated_dic)
功能特性
- 自动适配所有字段:无需手动指定待去重字段,递归遍历所有嵌套层级
- 保留元素顺序:去重后列表元素顺序与原始顺序完全一致
- 兼容任意嵌套结构:支持字典、列表任意深度嵌套的业务场景
- 无侵入性:不会修改原始输入数据,返回全新的处理后对象
内容的提问来源于stack exchange,提问作者Naveen Gupta
相关产品推荐
相关产品推荐

