我有一个python字典列表,可能像这样:
l = [{'id': 'scissor'}, {'id': 'cloth'}, {'id': 'scissor'}]
现在,我想知道是否存在一种有效的方法来从此列表中删除重复项。所以结果应该是这样的:
r = [{'id': 'scissor'}, {'id': 'cloth'}]
我尝试使用frozenset
,但是字典类型不能被散列。有没有一种有效的方法可以从python库中的任何结构中做到这一点?
编辑 如果字典完全相同,则这些项目被视为重复项。
答案 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'}]