我希望基于某个键或多个键的组合删除集合的所有重复项。
考虑以下字典列表:
c = [ {'a':1, 'b':2}, {'a':1, 'b':3}, {'a':1, 'b':2}, {'a':2, 'z':4}]
所需的输出将根据密钥删除重复项。对于a
删除的重复输出:
[ {'a':1, 'b':2}, {'a':2, 'z':4}]
对于可散列的集合,以下代码对我有用:
def dups(seq):
seen = []
for item in seq:
if item not in seen:
seen.append(item)
return seen
答案 0 :(得分:2)
使用OrderedDict
,但在frozenset
个键上进行散列:
from collections import OrderedDict
o = OrderedDict((frozenset(d), d) for d in reversed(c))
uniq = list(o.values())[::-1]
print(uniq)
# [{'a': 1, 'b': 2}, {'a': 2, 'z': 4}]
我先反转c
,然后再将其传递给OrderedDict
,然后反转我提取的值。这样可以确保我删除重复项,并保留第一个。
通过散列键的冻结集,可以将冻结集扩展到现有代码。使用set
进行有效查找。
def dups(seq):
seen = set()
for item in seq:
hashval = frozenset(item)
if hashval not in seen:
seen.add(hashval)
yield item
uniq = list(dups(c))
print(uniq)
# [{'a': 1, 'b': 2}, {'a': 2, 'z': 4}]