在词典列表中查找重复项

时间:2018-08-08 09:29:43

标签: python

我有一个python字典列表,可能像这样:

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

现在,我想知道是否存在一种有效的方法来从此列表中删除重复项。所以结果应该是这样的:

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

我尝试使用frozenset,但是字典类型不能被散列。有没有一种有效的方法可以从python库中的任何结构中做到这一点?

编辑 如果字典完全相同,则这些项目被视为重复项。

5 个答案:

答案 0 :(得分:2)

如果您不必提高效率:

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 :(得分:1)

应该工作:

l2 = []

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

设置项必须是可哈希的,而字典则不能。您可以使用pickle序列化所有字典,然后使用set获得唯一项,最后将它们反序列化为字典:

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

这将输出:

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

答案 4 :(得分:0)

我以以下最简单的方式向您推荐:

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