python 如何比较和删除同一字典中具有相同值的嵌套字典?

gudnpqoy  于 2022-12-10  发布在  Python
关注(0)|答案(2)|浏览(234)

如果我有一个字典,其中包含如下所示的数据,我应该执行什么过程(如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'}}

我只是在学习,所以如果有什么简单的东西我想不出来,我不会感到惊讶。我试图比较条目,如if ['1']['name']和['1']['sex'] ==['4']['name']和['4']['sex']:然后print ['4']只是为了测试,错误消息告诉我需要使用索引。我还成功地将其转换为一个列表,但在试图比较它们时遇到了另一个错误,例如如果person ['name']和person ['age']和person ['sex']等于四个循环中的另一行,则打印一条消息,但我一无所获。我'我也试着把它变成一个 Dataframe ,并使用pandas duplicate函数来删除昨天我得到的一些关于'dict'的错误的重复,可能是因为字典在 Dataframe 中被嵌套,与嵌套字典的列表形成对比,它看起来像这样:

[{1: {'name': 'John', 'age': '27', 'sex': 'Male'},
  2: {'name': 'Marie', 'age': '22', 'sex': 'Female'}]
d8tt03nd

d8tt03nd1#

您可以利用dict键总是唯一的这一事实来帮助删除重复项。由于dict是不可散列的,不能直接用作键,您可以先将每个子dict转换为一个元组项。使用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

vpfxa7rd

vpfxa7rd2#

一种方法是通过对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'}}

相关问题