如何过滤dicts列表只留下唯一的dicts

时间:2017-08-28 08:31:38

标签: python

我使用SQLAlchemy创建了查询。此查询生成器返回具有规则列表的4个对象。每条规则都是:; n1 n1t resb 1 n1o resb 1 ; n2 n2t resb 1 n2o resb 1 ; n3 n3t resb 1 n3o resb 1 ; a1 a1t resb 1 a1o resb 1 ; reflects the average ; s1 s1w resw 1 ; sum of n1 n2 n3 。我想获得一个只包含唯一dict的可迭代元素。 我尝试使用set():

{'type': u'psome_type', 'options': {}, 'weight': 1.0}

但是当我们传递给set.update字典时,它只通过密钥更新,但我想通过所有字典进行更新。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您的循环将不同词典的所有键添加到set。相反,如果您执行rules.update(d.items()),则会获得所有项目的set,并且可以使用其中的所有条目重新创建一个dict(假设没有重复的键具有不同的值),但这似乎不是你想要的。

>>> lst = [{"foo": 42, "bar": 23}, {"foo": 3.14}, {"bar": 23, "foo": 42}]
>>> s = set()
>>> for d in lst:
...     s.update(d.items())
...     
>>> dict(s)
{'foo': 3.14, 'bar': 23}

注意"foo": 42条目是如何消失的。相反,您可以从字典中创建可清除的frozenset'项目,收集set中的项目,并从这些项目中创建新的唯一词典:

>>> lst = [{"foo": 42, "bar": 23}, {"foo": 3.14}, {"bar": 23, "foo": 42}]
>>> [dict(x) for x in set(frozenset(d.items()) for d in lst)]
[{'foo': 3.14}, {'foo': 42, 'bar': 23}]