4 回答
TA贡献1846条经验 获得超7个赞
您可以使用frozenset()将每个字典散列items()到字典中,然后简单地获取分配的值:
list({frozenset(x.items()): x for x in list1 + list2}.values())
或使用map()应用于集合理解:
list(map(dict, {frozenset(x.items()) for x in list1 + list2}))
甚至只使用列表理解:
[dict(d) for d in {frozenset(x.items()) for x in list1 + list2}]
这将产生无序的结果:
[{'doc': 1, 'pos_fin': 10, 'pos_ini': 5},
{'doc': 1, 'pos_fin': 12, 'pos_ini': 7},
{'doc': 2, 'pos_fin': 10, 'pos_ini': 5},
{'doc': 7, 'pos_fin': 10, 'pos_ini': 5},
{'doc': 1, 'pos_fin': 7, 'pos_ini': 6},
{'doc': 2, 'pos_fin': 30, 'pos_ini': 25}]
注意:如果需要订购,则可以collections.OrderedDict()在此处改用:
from collections import OrderedDict
list(OrderedDict((frozenset(x.items()), x) for x in list1 + list2).values())
给出以下有序结果:
[{'doc': 1, 'pos_fin': 10, 'pos_ini': 5},
{'doc': 1, 'pos_fin': 12, 'pos_ini': 7},
{'doc': 2, 'pos_fin': 10, 'pos_ini': 5},
{'doc': 7, 'pos_fin': 10, 'pos_ini': 5},
{'doc': 1, 'pos_fin': 7, 'pos_ini': 6},
{'doc': 2, 'pos_fin': 30, 'pos_ini': 25}]
TA贡献1886条经验 获得超2个赞
在Python中,有个内置的set
集合对此非常适合。问题在于集合需要hashable
元素,因此您必须将字典转换为元组集合:
[dict(items) for items in set(tuple(sorted(d.items())) for d in (list1 + list2))]
TA贡献1860条经验 获得超8个赞
您可以根据这些值创建一个集合,而不是将其转换为可哈希对象(如元组)的字典:
unique_list = set(tuple(dictionary.items())) for dictionary in list1 + list2)
然后可以再次转换回字典和列表格式:
l = []
for item in unique_list:
l.append(dict(item))
像上面的东西应该工作。
添加回答
举报