我有一组对象W
,它们具有属性名称和分数。 __hash__()
函数仅基于名称,并且未定义__eq__()
函数,因此它基于__hash__()
函数。
现在,我想使用对象的分数。有没有比以下脚本更快的方式来引用实例?鉴于集合的工作方式,必须有......
tmp_obj = W(name="myname", score=0)
for obj in w_set:
if obj == tmp_obj: break
else:
# do nothing with obj
# do something with obj.score
答案 0 :(得分:1)
您可以使用in
运算符检查集合成员资格。这是集和字典中的常量时间操作,因为它们是作为哈希表实现的。对于列表和元组in
是线性时间。
obj = W("myname", 0)
if obj in w_set:
# do something with obj
答案 1 :(得分:0)
您没有说明如何设置对象,但为什么不使用if obj.score == 0
?
for obj in w_set:
if obj.score == 0:
break
或许您的问题是关于避免线性搜索? 如果您有很多对象,并且您将按分数进行大量搜索,则需要构建索引将分数映射到对象。据推测,几个对象可能具有相同的分数,因此我们将为每个分数构建一个列表(一组也可以):
from collections import defaultdict
score_index = defaultdict(list)
for obj in w_set:
score_index[obj.score].append(obj)
现在,您可以在不搜索的情况下循环遍历所有对象的列表,而不进行搜索:
for obj in score_index[0]:
# Do something