如何识别并移除字典内值重复的嵌套字典?
移除嵌套字典中的重复条目
给你两种简单可行的方法,帮你去掉字典里重复的嵌套条目:
方法一:构建新字典,保留首次出现的条目
核心思路是用一个集合记录已经见过的嵌套字典内容,遍历原字典时只把第一次出现的条目加入新字典:
people = {1: {'name': 'John R. Smith', 'age': '27', 'sex': 'Male'}, 2: {'name': 'Marie', 'age': '22', 'sex': 'Female'}, 3: {'name': 'Mariah', 'age': '32', 'sex': 'Female'}, 4: {'name': 'John R. Smith', 'age': '27', 'sex': 'Male'}} # 用来记录已经处理过的嵌套字典内容 seen = set() new_people = {} for key, info in people.items(): # 把嵌套字典转成可哈希的元组(按键排序,确保内容相同的字典转成的元组一致) info_tuple = tuple(sorted(info.items())) if info_tuple not in seen: seen.add(info_tuple) new_people[key] = info print(new_people)
运行后new_people里就只保留了键1、2、3的内容,键4的重复条目被自动跳过。
方法二:直接修改原字典,删除重复项
如果不想新建字典,想直接在原字典上操作,记得遍历键的副本(避免遍历中字典结构变化报错):
people = {1: {'name': 'John R. Smith', 'age': '27', 'sex': 'Male'}, 2: {'name': 'Marie', 'age': '22', 'sex': 'Female'}, 3: {'name': 'Mariah', 'age': '32', 'sex': 'Female'}, 4: {'name': 'John R. Smith', 'age': '27', 'sex': 'Male'}} seen = set() # 遍历原字典键的副本,防止删除键时打乱遍历流程 for key in list(people.keys()): info = people[key] info_tuple = tuple(sorted(info.items())) if info_tuple in seen: del people[key] else: seen.add(info_tuple) print(people)
说说你之前方法失败的原因
- 直接按键对比报错:大概率是你误把字典当列表用索引(比如用
people[0]而不是people[1]),或者遍历逻辑没处理好,导致索引错误。 - 转列表后对比无进展:你转成的列表结构不对(比如把整个字典包成一个列表元素),没法逐个对比嵌套字典的内容。
- 转DataFrame报错:嵌套字典直接转DataFrame结构不匹配,得先把结构扁平化,再用pandas去重,示例代码如下:
import pandas as pd people = {1: {'name': 'John R. Smith', 'age': '27', 'sex': 'Male'}, 2: {'name': 'Marie', 'age': '22', 'sex': 'Female'}, 3: {'name': 'Mariah', 'age': '32', 'sex': 'Female'}, 4: {'name': 'John R. Smith', 'age': '27', 'sex': 'Male'}} # 扁平化结构:把外层键作为id列,内层字典的键作为数据列 df = pd.DataFrame.from_dict(people, orient='index').reset_index().rename(columns={'index': 'id'}) # 按name、age、sex去重,保留首次出现的行 df_unique = df.drop_duplicates(subset=['name', 'age', 'sex'], keep='first') # 转回原字典结构 new_people = df_unique.set_index('id').to_dict('index') print(new_people)
内容的提问来源于stack exchange,提问作者realtime
相关产品推荐
相关产品推荐

