删除嵌套字典中的重复项
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)}}
我试图删除所有重复项,只使原始值保留在嵌套字典中。这是我下面的嵌套字典。在这本词典中,我试图检查两个名称是否相同,如果它们相同,则删除第二个和后续重复项。例如:词典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)}}