Python 3 - 多个字典键的交集

Chi*_*Lim 5 python dictionary intersection key python-3.x

下面是我的代码,任何人都可以通过使用 python 3 内置库函数帮助我优化过程吗?

Dict1 = {'ky1':1, 'ky2':2,'ky_3':3}
Dict2 = {'ky1':4, 'ky2':5,'ky_4':6}
Dict3 = {'ky2':7, 'ky3':8,'ky_5':9}
D = [Dict1,Dict2,Dict3]
Keys_list = []
for i in D:
   tmp = list(i.keys())
   Keys_list.append(tmp)
Output = list(set.intersection(*map(set,Keys_list)))
Run Code Online (Sandbox Code Playgroud)

我的Dict1、Dict2、Dict3 是大字典
谢谢

Ana*_*mar 3

如果您只想要所有字典中的所有键的列表,您可以使用dict.viewkeys()(For Python 2.7) 或dict.keys()在 Python 3.x 中获取字典视图对象,然后将它们相交。

Python 3.x 的示例 -

>>> Dict1 = {'ky1':1, 'ky2':2,'ky_3':3}
>>> Dict2 = {'ky1':4, 'ky2':5,'ky_4':6}
>>> Dict3 = {'ky2':7, 'ky3':8,'ky_5':9}
>>>
>>> Dict1.keys() & Dict2.keys() & Dict3.keys()
{'ky2'}
>>> list(Dict1.keys() & Dict2.keys() & Dict3.keys())
['ky2']
Run Code Online (Sandbox Code Playgroud)

对于 Python 2.7 Dict1.viewkeys(),请使用 等,而不是.keys().


如果您有一个字典列表,使用functools.reduce()函数在一行中执行此操作的一种方法是 -

>>> ld = [{'ky1':1, 'ky2':2,'ky_3':3},{'ky1':4, 'ky2':5,'ky_4':6},{'ky2':7, 'ky3':8,'ky_5':9}]
>>> res = list(reduce(lambda x, y: x & y.keys() , ld))
>>> res
['ky2']
Run Code Online (Sandbox Code Playgroud)

类似的逻辑,使用for循环 -

>>> ld = [{'ky1':1, 'ky2':2,'ky_3':3},{'ky1':4, 'ky2':5,'ky_4':6},{'ky2':7, 'ky3':8,'ky_5':9}]
>>> res = ld.pop()
>>> for d in ld:
...     res = res & d.keys()
...
>>> list(res)
['ky2']
Run Code Online (Sandbox Code Playgroud)