2013-08-26 38 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 

這將創建一個生成器對象,因此它僅有效地擴展了您目前正在檢查,一旦你找到一個匹配的目標要素,短路在迭代之外。

相關問題