筛选字典中的常用子字典键

2024-04-18 03:24:00 发布

您现在位置:Python中文网/ 问答频道 /正文

如何筛选父字典中其他子字典键中存在的所有公共子字典键

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']

目前的解决方案是

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]

有没有更简单的解决办法?你知道吗


Tags: keyinforlenif字典notresult
3条回答

一旦提取了所有键,就可以执行一个^{}操作。那就一行了:

set.intersection(*(set(x) for x in d.itervalues()))

分解一下,评估的第一部分是:

(set(x) for x in d.itervalues())

这是一个发电机,它产生:

{'key_x', 'key_y'}, {'key_x', 'key_y', 'key_z'}, {'key_x', 'key_y'}

在Python 3中,该生成器等效于:

map(set, d.values())

但是在python2中,^{}效率较低,因为它构造了一个我们不需要的list(就像^{}而不是^{}一样)。你知道吗

在任何情况下,该生成器的结果都会传递给set.intersection(使用*参数unpacker)以在单个调用中完成繁重的工作。你知道吗

您可以使用^{}将词典^{},然后^{}

>>> 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'}

注意:在python3中,reduce被移到了functools。你知道吗

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

作为pandas的替代方法,键不需要排序:

import pandas as pd

list(pd.DataFrame(d).dropna().index)

#['key_x', 'key_y']

相关问题 更多 >