繁体   English   中英

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

[英]How can i compare and remove nested dictionaries with the same values within the same dictionary?

如果我有一个包含数据的字典,如下所示,我应该像 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'] and ['1']['sex'] == ['4']['name'] and ['4'][' sex']: 然后 print['4'] 只是为了测试,错误消息告诉我我需要使用索引。 我也把它变成了一个成功的列表,但是在尝试以 if person['name'] and person['age'] and person['sex'] is equal 这样的方式比较它们时遇到了另一个错误到四循环中的另一行而不是打印一条消息,我一无所获。 我还尝试将它变成 dataframe 并使用 pandas 副本 function 删除重复项,昨天我在其中遇到了一些关于“dict”的错误,这可能是因为字典嵌套在 dataframe 中,与带有嵌套字典的列表形成对比看起来像这样:

[{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)

Output:

{1: {'age': '27', 'name': 'John R. Smith', 'sex': 'Male'},
 2: {'age': '22', 'name': 'Marie', 'sex': 'Female'},
 3: {'age': '32', 'name': 'Mariah', 'sex': 'Female'}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM