2016-06-02 2 views
-1

У меня есть набор объектов W, у которых есть имя атрибута и оценка. Функция __hash__() основана только на имени, а функция __eq__() не определена, поэтому она основана на функции __hash__().Python: поиск через набор объектов

Теперь я хочу использовать оценку объекта. Есть ли более быстрый способ ссылаться на экземпляр, чем на следующий сценарий? Учитывая то, как множество работ, должно быть ...

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 
+0

Но я хочу использовать оценку объекта в наборе, а не со счетом временного объекта. * вопрос редактирования * – Lewistrick

+0

Зачем вам нужен временный объект? –

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 
Смежные вопросы