2013-08-26 2 views
1

У меня есть список следующего вида:Python: Найти позицию в списке первого объекта, уважение заданного условия

class Any(object): 
    def __init__(self,a,b): 
     self.a=a 
     self.b=b 

l=[Any(1,3),Any(2,4),Any(1,2),Any(None,6),Any('hello',6), Any(1,'ChuckNorris'),Any(1,2)] 

l представляет собой список, который содержит только экземпляры Any. Я бы хотел найти позицию первого из этих экземпляров, атрибут a равен «None».

Как мой список очень длинный, алгоритм не должен исследовать весь список, но он должен остановиться, как только условие (в моем примере, атрибут a равно None).

В приведенном выше примере ответ этого алгоритма должно быть 3.

ответ

6

Используйте выражение генератора и next:

next((i for i, item in enumerate(l) if item.a is None), None) 

Это возвращение будет None если такой элемент не найден.

Демо:

>>> l=[Any(1,3),Any(2,4),Any(1,2),Any(None,6),Any('hello',6), Any(1,'ChuckNorris'),Any(1,2)] 
>>> next((i for i, item in enumerate(l) if item.a is None), None) 
3 
+0

Та же идея, как у меня, но чище благодаря распаковке внутри генератора. +1 –

+0

Это работает отлично. Большое спасибо за вашу помощь! –

4
try: 
    answer = next((val for val in enumerate(l) if val[1].a is None))[0] 
except StopIteration: 
    # No element matching condition in sequence 
    answer = None 

Это создает объект-генератор, так что эффективно только расширяет элемент, который в настоящее время проверки, и как только вы найдете цель согласования, коротких замыканий из итерации.

Смежные вопросы