2013-06-05 4 views
0

У меня такая ситуация, как код ниже. Я хочу найти индекс первого экземпляра объекта A. Какой самый быстрый способ я могу сделать?Поиск экземпляра типа объекта в списке

Я знаю, что есть много способов пройти весь список и найти его, но есть ли способ остановить поиск, как только первый найден?

class A(): 
    def __init__(self): 
     self.a = 0 
    def print(self): 
     print(self.a) 

l = [0, 0, A(), 0, A(), 0] 
print(l.index(type(A))) # this does not work 
+0

Вы хотите найти первый экземпляр или индекс первого экземпляра? – cmh

+0

индекс первого экземпляра, я уточню это. – EasilyBaffled

+0

Как вы можете использовать 'def print (self)'? –

ответ

2
class A(): 
    def __init__(self): 
     self.a = 0 
    def __eq__(self,other): #this overrides the equality check 
     if isinstance(other,A): 
      return self.a==other.a 
    def print(self): 
     print(self.a) 

l = [0, 0, A(), 0, A(), 0] 
print(l.index(A()))#now this should work 
print A() in l 

a1 = A() 
a2 = A() 
a1 == a2 #True 
a1.a = 2 
a1 == a2 #False 
a2.a = 2 
a1 == a2 #True 
a2.a = 5 
a1 < a2 #Error we would need to overload __cmp__ or __lt__ methods for this to work 
+0

Что такое cmp (я предполагаю сравнение с python2) и как он имеет отношение к вопросу? – EasilyBaffled

+0

ahh да, я должен был просто сделать проверку на равенство ... я действительно не нуждался в cmp ... отредактировал –

+0

Значит ли это .индекс использует данные объекты __eq__ против всего в списке? – EasilyBaffled

3

Необходимо проверить каждый объект; использовать список понимание и enumerate(), чтобы получить все соответствующие показатели:

[i for i, ob in enumerate(l) if isinstance(ob, A)] 

или, чтобы получить первый индекс, используйте next() и выражение генератора:

next((i for i, ob in enumerate(l) if isinstance(ob, A)), None) 

Демо:

>>> [i for i, ob in enumerate(l) if isinstance(ob, A)] 
[2, 4] 
>>> next((i for i, ob in enumerate(l) if isinstance(ob, A)), None) 
2 
+0

Я полагаю, ваш ответ немного более подробный, чем мой был :). +1 к вам, сэр. – mgilson

0

Наиболее очевидный способ:

for index, value in enumerate(l): 
    if isinstance(value,A): 
     return (index, value) 
Смежные вопросы