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

Python如何根据属性值查找类实例列表中对应实例的索引

实现方案

简化遍历写法(语法更优雅,时间复杂度仍为O(n))

使用next()配合生成器表达式可以把原来的多行循环压缩为一行:

# 匹配到就返回索引,没匹配到默认返回-1
ind = next((ind for ind, item in enumerate(Test.all_objects) if item.name == 'joe'), -1)
print(ind)

这种写法和你原来的遍历逻辑完全一致,只是语法更简洁,只会遍历到第一个匹配项就停止,不会做多余的遍历。

用index()方法实现的写法

可以先提取所有实例的目标属性生成新列表,再调用index():

ind = [item.name for item in Test.all_objects].index('joe')
print(ind)

这种写法代码最短,但需要先遍历一次全列表生成属性列表,再遍历第二次找索引,性能比第一种写法差,仅适合数据量小的场景使用,且没匹配到会直接抛出ValueError异常,需要额外捕获处理。

完全免遍历的优化方案

如果查询频率很高,可以在类内额外维护一个属性到索引的映射表,初始化实例时同步更新映射,后续查询时间复杂度为O(1):

class Test():
    all_objects=[]
    # 新增name到索引的映射表
    name_to_idx = {}
    def __init__(self,name,age):
        self.name = name
        self.age = age
        # 新增实例时同步写入映射
        current_idx = len(Test.all_objects)
        Test.all_objects.append(self)
        Test.name_to_idx[name] = current_idx

# 初始化实例
Test("joe",23)
Test("kate",16)
Test("adam",56)

# 直接查询映射,无需遍历
print(Test.name_to_idx['joe'])

如果业务中存在实例删除、实例属性修改的场景,需要同步更新name_to_idx映射表保证数据一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:15:01