不可散列的类型,从集合中删除重复项,但保持输入顺序

时间:2019-01-05 17:32:58

标签: python python-3.x dictionary hash

我希望基于某个键或多个键的组合删除集合的所有重复项。

考虑以下字典列表:

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

1 个答案:

答案 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}]