2024-04-19 16:17:06 发布
网友
有没有比计算它们的交集更容易/更快地找出两个字典是否不相交?在
对于我找到的交叉点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)
然而,我认为这是低效的,因为它总是计算整个交叉口(没有短路退出)。在
有更好的主意吗?在
编辑后仅显示方法和计时
自从OP询问了执行此操作的最快方法后,我根据我机器上的一个公平测试(我希望)对讨论中的方法进行了排序。其目的是找出字典的键是否不相交,dict_keys.isdisjoint()方法似乎优于其他集合或列表操作。在
dict_keys.isdisjoint()
然而,正如其他答案中提到的,这将取决于相关词典的大小以及它们是否不相交。在
这些测试仅适用于两个大小相等(较小)的不相交词典。在
最快:dict_keys.isdisjoint()
示例:
{"a": 1, "b": 2, "c": 3 }.keys().isdisjoint({ "d": 4, "e": 5, "f": 6}.keys())
时间安排:
第二快:set.isdisjoint()
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()
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()
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
不要转换为集合;dict_keys对象已经支持isdisjoint。在
dict_keys
isdisjoint
d1.keys().isdisjoint(d2)
你是不是在找这样的东西:
def dicts_disjoint(a, b): return not any(k in b for k in a)
或者:
两者都会短路。在
编辑后仅显示方法和计时
自从OP询问了执行此操作的最快方法后,我根据我机器上的一个公平测试(我希望)对讨论中的方法进行了排序。其目的是找出字典的键是否不相交,
dict_keys.isdisjoint()
方法似乎优于其他集合或列表操作。在然而,正如其他答案中提到的,这将取决于相关词典的大小以及它们是否不相交。在
这些测试仅适用于两个大小相等(较小)的不相交词典。在
最快:
dict_keys.isdisjoint()
示例:
时间安排:
^{pr2}$第二快:
set.isdisjoint()
示例:
时间安排:
第三快:列出Comp和
all()
:示例:
时间安排:
第四快:对称差分(
^
)与not()
示例:
时间安排:
不要转换为集合;
dict_keys
对象已经支持isdisjoint
。在你是不是在找这样的东西:
或者:
^{pr2}$两者都会短路。在
相关问题 更多 >
编程相关推荐