根据给定键的值唯一性,删除字典列表中的重复字典

时间:2020-05-28 23:05:34

标签: python dictionary

我有字典:

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'}]

我想遍历该列表并创建一个新列表,其中包含带有键“ type”的唯一值的字典。我不在乎哪个字典保留,使用该键的第一个实例:值保留,其余的省略。所以最后我想看看:

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)

3 个答案:

答案 0 :(得分:2)

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

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'遇到的 first 字典。

例如,如果您想要遇到 last ,则可以执行类似的操作,例如在dicts上依次进行迭代,因此

for d in reversed(dicts):
    ...

答案 1 :(得分:2)

您可以创建一个临时字典,以在第一次遇到特定类型时保存第一个字典,然后使用其中的最终值创建包含一行附加代码的更新列表。

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'}]

temp = {}
for d in dicts:
    if d['type'] not in temp:
        temp[d['type']] = d

dicts = list(temp.values())  # Update list.

for d in dicts:
    print(d)

答案 2 :(得分:1)

保留可见的类型并将缺失添加到结果切片并将其标记为可见。执行此操作的功能:

clean_content