在一组字典中查找重复项

3

我有一个 Python 字典列表,可能长这样:

l = [{'id': 'scissor'}, {'id': 'cloth'}, {'id': 'scissor'}]

现在,我想知道是否有一种有效的方法从这个列表中去除重复项。因此结果应该类似于:

r = [{'id': 'scissor'}, {'id': 'cloth'}]

我尝试使用frozenset,但是字典类型无法被哈希。是否有一种有效的方法可以从python库中的任何结构中实现这一点? 编辑 如果字典完全相同,则认为项目是重复的。

您想在什么要求下删除字典?如果它们具有相同的键,还是只有当它们完全相同时? - Bernhard
@Bernhard:如果它们和示例完全一样。 - Luca
2
https://dev59.com/lWox5IYBdhLWcg3wHAsA - Joe
我们能否创建一个包含列表 l 中所有元素的 hashset,并赋予任意值。该 hashset 的键/元素将给出 r - impossible
5个回答

4
r = [x for i,x in enumerate(l) if x not in l[:i]]

3
如果您不需要高效:

如果您不需要效率:

from functools import partial
import json

list(map(json.loads, set(map(partial(json.dumps, sort_keys=True), l))))

如果你必须要高效:

serialized = map(tuple, map(sorted, map(dict.items, l)))
unique = set(serialized)
result = list(map(dict, unique))

1
应该可以工作:
l2 = []

for d in l:
    if d not in l2:
        l2.append(d)

不需要花哨,只要简单易懂 - Jean-François Fabre

1
我建议您采用以下最简单的方法:

l = [{'id': 'scissor'}, {'id': 'cloth'}, {'id': 'scissor'}]

r= []
for i in l:
    if i not in r:
        r.append(i)

print(r)   # [{'id': 'scissor'}, {'id': 'cloth'}]

0

集合的元素必须是可哈希的,而字典不是。您可以使用pickle序列化所有字典,然后使用set获取唯一元素,并最终将其反序列化为字典:

import pickle
print(list(map(pickle.loads, set(map(pickle.dumps, l)))))

这将输出:

[{'id': 'cloth'}, {'id': 'scissor'}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接