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
相关产品推荐
相关产品推荐

