python:只查找几个dicts的公共键值对:dict intersection

Lau*_*low 13 python

我在列表中有0个或更多的dicts:

>>> dicts = [dict(a=3, b=89, d=2), dict(a=3, b=89, c=99), dict(a=3, b=42, c=33)]
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的dict,它只包含上述所有字符串中的键,并且只有值完全相同时:

>>> dict_intersection(*dicts)
{"a": 3}
Run Code Online (Sandbox Code Playgroud)

我觉得应该有一种优雅的写作方式dict_intersection,但我自己只会提出不优雅和/或低效的解决方案.建议?

int*_*jay 20

>>> dict(set.intersection(*(set(d.iteritems()) for d in dicts)))
{'a': 3}
Run Code Online (Sandbox Code Playgroud)

注意:除了键之外,此解决方案还要求字典值可以清除.


Joh*_*rra 5

由于键/值对必须已经在第一个 dict 中,因此您可以迭代此 dict 的项目。

dict(pair for pair in dicts[0].items() 
     if all((pair in d.items() for d in dicts[1:])))
Run Code Online (Sandbox Code Playgroud)

看起来不如 interjay 的答案优雅,但不受可散列值的限制。

编辑:将all表达式更改为生成器表达式以提高速度