如果我有一个包含数据的字典,像下面这样,我应该执行什么过程,比如If语句来删除重复的条目,比如嵌套字典1和4。假设我想删除4,因为用户输入了它,我假设每个人都是唯一的,所以他们不可能有相同的人口统计数据,不可能有两个John R. Smiths。
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'}}
我只是在学习,所以如果有一些简单的东西我不能想出,我不会感到惊讶。我试图比较等条目如果[1]['名字']和[1]['性']= =[' 4 ']['名字']和[' 4 ']['性']:然后打印['4']只是为了测试,错误消息告诉我需要使用索引。我也把它变成了一个列表,这是成功的,但遇到了另一个错误,当试图比较他们的方式,如如果人['name']和人['age']和人['sex']是等于另一行在一个四个循环比打印一个消息,我没有得到任何地方。我还尝试将其转换为数据框,并使用pandas duplicate函数删除我得到一些错误的副本昨天关于'dict'可能是因为字典是嵌套在数据框中,而列表是嵌套的字典通常是这样的:
[{1: {'name': 'John', 'age': '27', 'sex': 'Male'},
2: {'name': 'Marie', 'age': '22', 'sex': 'Female'}]
您可以利用字典键总是惟一的这一事实来帮助消除重复数据。由于字典是不可哈希的,不能直接用作键,因此可以首先将每个子字典转换为项的元组。使用dict.setdefault
只保留每个不同键的第一个值:
records = {}
for number, record in people.items():
records.setdefault(tuple(record.items()), (number, record))
print(dict(records.values()))
给定示例输入,这将输出:
{1: {'name': 'John R. Smith', 'age': '27', 'sex': 'Male'}, 2: {'name': 'Marie', 'age': '22', 'sex': 'Female'}, 3: {'name': 'Mariah', 'age': '32', 'sex': 'Female'}}
演示:https://replit.com/@blhsing/LonelyNumbWatch
一种方法是通过遍历people
并将数据唯一的人分配给新字典来构建新字典。下面的解决方案使用set
来跟踪唯一用户:
from pprint import pprint
unique_people = {}
unique_ids = set()
for key, data in people.items():
data_id = tuple(data.values())
if data_id in unique_ids:
continue
unique_people[key] = data
unique_ids.add(data_id)
pprint(unique_people)
输出:
{1: {'age': '27', 'name': 'John R. Smith', 'sex': 'Male'},
2: {'age': '22', 'name': 'Marie', 'sex': 'Female'},
3: {'age': '32', 'name': 'Mariah', 'sex': 'Female'}}