如何在复杂结构的自定义Python类中按键查找列表项?
问题分析与解决方案
原代码核心问题
- 语法错误:
Person.__init__方法定义后缺失冒号:- 魔法方法名错误:实现下标访问的标准方法是
__getitem__,原代码写为__getitems__;Hobby类中的__get_item__应为__getitem__,且参数逻辑错误
- 数据结构不匹配:
- 创建
Hobby实例时传入的字典存在括号不匹配、嵌套逻辑混乱的问题 Hobbies.__getitem__中错误地将Hobby实例当作字典访问(item['hobby']),实际应访问实例属性item.hobby- 检索逻辑与实际存储的数据结构不对应,导致无法匹配目标值
- 创建
修正后的完整代码
import pprint class Person(): def __init__(self, name): self.name = name class Hobbies(): def __init__(self): self.items = [] def __len__(self): return len(self.items) def __getitem__(self, key): # 遍历所有Hobby实例,支持两种检索逻辑 for hobby_obj in self.items: hobby_data = hobby_obj.hobby # 先匹配hobby1/hobby2这类分类键 if key in hobby_data: return hobby_data[key] # 再匹配name为指定值的爱好项 for category in hobby_data.values(): if isinstance(category, list): for item in category: if isinstance(item, dict) and item.get('name') == key: return item return None def add_hobby(self, hobby): self.items.append(hobby) class Hobby(): def __init__(self, hobby): self.hobby = hobby def __getitem__(self, key): pp = pprint.PrettyPrinter() return pp.pformat(self.hobby.get(key, f"Key '{key}' not found")) # 初始化实例,修正数据结构 person = Person("James") hobbies = person.Hobbies() hobby = Hobby({ 'hobby1': [{'name':'walking', 'regularity':'Daily', 'type':'physical'}], 'hobby2': [{'name':'reading', 'regularity':'Weekly', 'type':'mental'}] }) hobbies.add_hobby(hobby) # 测试两种检索需求 print(hobbies['walking']) print(hobbies['hobby1'])
关键修改说明
- 语法修正:补全缺失的语法符号,将错误的魔法方法名改为Python标准的
__getitem__,实现下标[]访问功能 - 数据结构优化:调整
Hobby初始化字典的嵌套逻辑,保证括号匹配,让分类与爱好项的对应关系更清晰 - 检索逻辑适配:在
Hobbies.__getitem__中实现双重检索逻辑——先匹配分类键(如hobby1),再遍历匹配爱好名称(如walking),满足两种检索需求 - Hobby类功能完善:修正
__getitem__方法,使其能直接访问实例内的字典键值并格式化输出
运行代码后会输出:
{'name': 'walking', 'regularity': 'Daily', 'type': 'physical'} [{'name': 'walking', 'regularity': 'Daily', 'type': 'physical'}]
内容的提问来源于stack exchange,提问作者Remy
相关产品推荐
相关产品推荐

