过滤字典中的常见子字典键

PYP*_*YPL 4 python dictionary filter

如何过滤父词典中其他子词典键中存在的所有常用子词典键

d = {
  '0': {'key_x': 0, 'key_y': 15, 'key_z': 41}
  '1': {'key_x': 5, 'key_y': 22}
  '2': {'key_x': 6, 'key_y': 41}
}

result ['key_x', 'key_y']
Run Code Online (Sandbox Code Playgroud)

目前解决方案是

intersect = {}
for k in corner_values.keys():
    for j in corner_values[k]:
        if j not in intersect:
            intersect[j] = 1
        else:
            intersect[j] += 1

for k in intersect:
    if intersect[k] != len(corner_values.keys()):
        del intersect[k]
Run Code Online (Sandbox Code Playgroud)

有没有更简单的解决方案呢?

tob*_*s_k 5

您可以map使用词典set然后reduce使用set.intersection:

>>> from functools import reduce # if you are using Python 3
>>> d = {                       
...   '0': {'key_x': 0, 'key_y': 15, 'key_z': 41},
...   '1': {'key_x': 5, 'key_y': 22},
...   '2': {'key_x': 6, 'key_y': 41}
... }
>>> reduce(set.intersection, map(set, d.values()))
{'key_x', 'key_y'}
Run Code Online (Sandbox Code Playgroud)

注意:在Python 3中,reduce已被移至functools.

更新:如@ John的回答所示,set.intersection可以处理任意数量的集合,因此reduce甚至不需要.只是set.intersection(*map(set, d.values()))