You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何检查嵌套字典是否包含自定义类型MyObject的实例?

问题

我想了解如何检查一个键值对字典中是否存在或包含自定义对象MyObject的实例,该字典的值可以是包含MyObject的任意Python类型(如列表、集合、元组、嵌套字典等)。示例字典如下:

{
   "test1": MyObject(),
   "test2": [MyObject(), MyObject()],
   "test3": {"some_key": MyObject()},
   "test4": {"some_key": [MyObject()]},
   "test5": (MyObject(), MyObject()), # tuple
   "test6": {MyObject(), MyObject()}, # set
   "test7": {"some_key1": {"some_key2": {"some_key3": MyObject()}}}
}

我已尝试编写如下函数,但希望简化该实现,使其返回布尔值以标识字典是否包含MyObject实例:

def contains_object(d):
   for k,v in d.items():
      if isinstance(v, MyObject):
         return True
      elif isinstance(v, (list, set, tuple)):
         for i in v:
            if isinstance(i, MyObject):
               return True
      elif isinstance(v, dict):
         for a, b in v.items():
            if isinstance(b, MyObject):
               return True
   return False
简化实现方案

你原来的函数只能处理一层嵌套,像test4、test7这种深层嵌套的结构会漏检。可以用递归遍历的方式简化实现,一次性覆盖所有嵌套容器类型:

def contains_myobject(obj):
    # 先检查当前对象是否是目标实例
    if isinstance(obj, MyObject):
        return True
    # 处理字典:递归检查所有值
    elif isinstance(obj, dict):
        return any(contains_myobject(v) for v in obj.values())
    # 处理列表、元组、集合:递归检查每个元素
    elif isinstance(obj, (list, tuple, set)):
        return any(contains_myobject(item) for item in obj)
    # 非目标类型也非容器,直接返回False
    return False

关键说明:

  • 递归遍历:不管对象嵌套多少层,都会逐层检查每个元素/值,不会漏过深层的MyObject实例
  • any()函数:只要找到一个目标实例就立即返回True,无需遍历全部内容,效率和你原函数一致,但代码更简洁
  • 明确容器类型:只处理列表、元组、集合这几种需要遍历的容器,避免误处理字符串这类可迭代但不需要检查的类型

使用时直接传入目标字典即可:

my_dict = {
   "test1": MyObject(),
   "test2": [MyObject(), MyObject()],
   "test3": {"some_key": MyObject()},
   "test4": {"some_key": [MyObject()]},
   "test5": (MyObject(), MyObject()),
   "test6": {MyObject(), MyObject()},
   "test7": {"some_key1": {"some_key2": {"some_key3": MyObject()}}}
}

print(contains_myobject(my_dict))  # 输出 True

内容的提问来源于stack exchange,提问作者phantom_menace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:49:58