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

如何在复杂结构的自定义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'])

关键修改说明

  1. 语法修正:补全缺失的语法符号,将错误的魔法方法名改为Python标准的__getitem__,实现下标[]访问功能
  2. 数据结构优化:调整Hobby初始化字典的嵌套逻辑,保证括号匹配,让分类与爱好项的对应关系更清晰
  3. 检索逻辑适配:在Hobbies.__getitem__中实现双重检索逻辑——先匹配分类键(如hobby1),再遍历匹配爱好名称(如walking),满足两种检索需求
  4. Hobby类功能完善:修正__getitem__方法,使其能直接访问实例内的字典键值并格式化输出

运行代码后会输出:

{'name': 'walking', 'regularity': 'Daily', 'type': 'physical'}
[{'name': 'walking', 'regularity': 'Daily', 'type': 'physical'}]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:15:20