Python:搜索一组对象

时间:2016-06-02 09:44:14

标签: python object set

我有一组对象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

2 个答案:

答案 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