删除嵌套字典中的重复项

Removing duplicates in nested dictionaries

我试图删除所有重复项,只使原始值保留在嵌套字典中。这是我下面的嵌套字典。在这本词典中,我试图检查两个名称是否相同,如果它们相同,则删除第二个和后续重复项。例如:词典4和5同名'Sasha',所以应该删除词典5

    dict1 = {
1: {'friends': [2],
     'history': [],
     'id': 1,
     'name': 'Fred',
     'date_of_birth': datetime.date(2022, 2, 1)},
 2: {'friends': [1],
     'history': [],
     'id': 2,
     'name': 'Jenny',
     'date_of_birth': datetime.date(2004, 11, 18)},
 3: {'friends': [4],
     'history': [],
     'id': 3,
     'name': 'Jiang',
     'date_of_birth': datetime.date(1942, 9, 16)},
 4: {'friends': [3],
     'history': [],
     'id': 4,
     'name': 'Sasha',
     'date_of_birth': datetime.date(1834, 2, 2)},
 5: {'friends': [6],
     'history': [],
     'id': 5,
     'name': 'Sasha',
     'date_of_birth': datetime.date(1834, 2, 2)},
 6: {'friends': [5],
     'history': [],
     'id': 6,
     'name': 'Amir',
     'date_of_birth': datetime.date(1981, 8, 11)}}

我已经像这样实现了我的解决方案,但我不明白我哪里出错了。

temp = []
res = dict()
for key, val in dict1.items():
    if val not in temp:
        temp.append(val)
        res[key] = val

print(pprint.pformat(res))

如果有人能帮助我,那就太好了。

在你的for-loop中,val是内字典,仔细看,4和5的值是不一样的("friends""id"是不一样的), 所以它不会被丢弃。但是,由于您只需要 "name" 相同(而不是整个字典),您可以跟踪 "name" 而只保留唯一名称:

temp = []
res = dict()
for key, val in dict1.items():
    if val['name'] not in temp:
        temp.append(val['name'])
        res[key] = val

编辑:

如果目标也是“移动”键,您可以通过仅将 non-duplicate 值存储在 res 中,然后 zip 将其与dict1 的键来创建输出字典:

temp = set()
res = []
for val in dict1.values():
    if val['name'] not in temp:
        temp.add(val['name'])
        res.append(val)
out = dict(zip(dict1, res))

输出:

{1: {'friends': [2],
  'history': [],
  'id': 1,
  'name': 'Fred',
  'date_of_birth': datetime.date(2022, 2, 1)},
 2: {'friends': [1],
  'history': [],
  'id': 2,
  'name': 'Jenny',
  'date_of_birth': datetime.date(2004, 11, 18)},
 3: {'friends': [4],
  'history': [],
  'id': 3,
  'name': 'Jiang',
  'date_of_birth': datetime.date(1942, 9, 16)},
 4: {'friends': [3],
  'history': [],
  'id': 4,
  'name': 'Sasha',
  'date_of_birth': datetime.date(1834, 2, 2)},
 5: {'friends': [5],
  'history': [],
  'id': 6,
  'name': 'Amir',
  'date_of_birth': datetime.date(1981, 8, 11)}}