检查两个词典是否分离

2024-04-19 16:17:06 发布

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

有没有比计算它们的交集更容易/更快地找出两个字典是否不相交?在

对于我找到的交叉点this answer,因此不相交测试如下所示:

def dicts_disjoint(a, b):
    keys_a = set(a.keys())
    keys_b = set(b.keys())
    intersection = keys_a & keys_b
    return not len(intersection)

然而,我认为这是低效的,因为它总是计算整个交叉口(没有短路退出)。在

有更好的主意吗?在


Tags: answerlenreturn字典defnotkeysthis
0条回答
网友
1楼 · 发布于 2024-04-19 16:17:06

编辑后仅显示方法和计时

自从OP询问了执行此操作的最快方法后,我根据我机器上的一个公平测试(我希望)对讨论中的方法进行了排序。其目的是找出字典的键是否不相交,dict_keys.isdisjoint()方法似乎优于其他集合或列表操作。在

然而,正如其他答案中提到的,这将取决于相关词典的大小以及它们是否不相交。在

这些测试仅适用于两个大小相等(较小)的不相交词典。在

最快:dict_keys.isdisjoint()

示例:

{"a": 1, "b": 2, "c": 3 }.keys().isdisjoint({ "d": 4, "e": 5, "f": 6}.keys())

时间安排:

^{pr2}$

第二快:set.isdisjoint()

示例:

set({"a": 1, "b": 2, "c": 3 }.keys()).isdisjoint(set({ "d": 4, "e": 5, "f": 6}.keys()))

时间安排:

>>> timeit.timeit('set({"a": 1, "b": 2, "c": 3 }.keys()).isdisjoint(set({ "d": 4, "e": 5, "f": 6}.keys()))')
0.774243315012427

第三快:列出Comp和all():

示例:

all(k not in {"a": 1, "b": 2, "c": 3 } for k in { "d": 4, "e": 5, "f": 6})

时间安排:

>>> timeit.timeit('all(k not in {"a": 1, "b": 2, "c": 3 } for k in { "d": 4, "e": 5, "f": 6})')
0.8577601349970791

第四快:对称差分(^)与not()

示例:

not set({"a": 1, "b": 2, "c": 3 }.keys()) ^ set({ "d": 4, "e": 5, "f": 6}.keys())

时间安排:

>>> timeit.timeit('not set({"a": 1, "b": 2, "c": 3 }.keys()) ^ set({ "d": 4, "e": 5, "f": 6}.keys())')
0.9617313010094222
网友
2楼 · 发布于 2024-04-19 16:17:06

不要转换为集合;dict_keys对象已经支持isdisjoint。在

d1.keys().isdisjoint(d2)
网友
3楼 · 发布于 2024-04-19 16:17:06

你是不是在找这样的东西:

def dicts_disjoint(a, b):
    return not any(k in b for k in a)

或者:

^{pr2}$

两者都会短路。在

相关问题 更多 >