首页 > 解决方案 > 根据给定键的值唯一性删除字典列表中的重复字典

问题描述

我有一本字典:

dicts = [
{'id': 'item1', 'type': 'foo', 'metaId': 'metaId1'},
{'id': 'item2', 'type': 'foo', 'metaId': 'metaId2'},
{'id': 'item3', 'type': 'foo3', 'metaId': 'metaId3'},
{'id': 'item4', 'type': 'foo2', 'metaId': 'metaId2'},
{'id': 'item5', 'type': 'foo3', 'metaId': 'metaId3'},
{'id': 'item6', 'type': 'foo2', 'metaId': 'metaId2'},
{'id': 'item7', 'type': 'foo3', 'metaId': 'metaId3'},
{'id': 'item8', 'type': 'foo2', 'metaId': 'metaId2'},
{'id': 'item9', 'type': 'foo3', 'metaId': 'metaId3'}]

我想遍历列表并创建一个新列表,其中包含具有键“类型”的唯一值的字典。我不在乎保留哪些字典,首先使用该键:值保留,其余的被省略。所以最后我想看看:

expected = [
{'id': 'item1', 'type': 'foo', 'metaId': 'metaId1'},
{'id': 'item3', 'type': 'foo3', 'metaId': 'metaId3'},
{'id': 'item4', 'type': 'foo2', 'metaId': 'metaId2'}
]

这是我尝试过的,绝对不是我需要的,因为它返回一个空列表。我想我很难在新的字典子列表中检查一个值以使其被排除在外

keys_to_keep = set()
expected = []
for d in dicts:
    for key, value in d.items():
        if value not in expected:
            keys_to_keep.add(key)
remove_keys = set(d) - keys_to_keep

for d in dicts:
    for k in remove_keys:
        del d[k]
dicts = expected
print(dicts)

标签: pythondictionary

解决方案


你总是得到一个空列表的原因是因为你只是这样做:

dicts = expected

而且expected只是一个空列表,你从来没有做过任何事情……不知道为什么你会认为expected会改变。

但是你把事情复杂化了。只需保留一组唯一值,然后创建一个新的字典列表。

seen = set()
result = []
for d in dicts:
    if d['type'] not in seen:
        result.append(d)
        seen.add(d['type'])

这种方法使遇到的第一个字典具有唯一性'type'

例如,如果您想要最后遇到的,您可以执行类似dicts以 rerere order 进行迭代的操作,所以

for d in reversed(dicts):
    ...

推荐阅读