2014-10-20 54 views
3

我有一個列表,可以包含多個不同類型的元素。 我需要檢查在這個列表中是否有一個或多個特定類型的元素並獲取其索引。按類型在列表中查找項目

l = [1, 2, 3, myobj, 4, 5] 

我能實現這個目標,通過簡單地遍歷我的列表,檢查每個元素的類型:

for i, v in enumerate(l): 
    if type(v) == Mytype: 
    return i 

是否有實現相同的結果更Python的方式?

+0

你需要該類型的所有元素的索引,或者只是第一個? – BrenBarn 2014-10-20 18:44:56

+0

@BrenBarn在我的具體情況下,我只需要第一個,但一個「一般」的解決方案,將不勝感激。 – Nick 2014-10-20 18:45:59

+0

你可以使用理解或生成器exp - 但是這意味着你必須通過整個列表來查看是否至少有一個。您的方法更高效IMO。 – karthikr 2014-10-20 18:46:11

回答

6

您可以使用nextgenerator expression

return next(i for i, v in enumerate(l) if isinstance(v, Mytype)): 

這種解決方案的優點是,它是懶人喜歡你目前的一個:它只會檢查儘可能多的項目是必要的。

此外,我使用isinstance(v, Mytype)而不是type(v) == Mytype,因爲它是Python中類型檢查的首選方法。見PEP 0008

最後,應該注意的是,如果找不到所需的項目,此解決方案將引發StopIteration異常。你可以用一個try/catch此除,或者你可以指定一個默認值返回:如果沒有找到

return next((i for i, v in enumerate(l) if isinstance(v, Mytype)), None): 

在這種情況下,None將被退回。

+0

如何以這種方式獲取元素的索引? – Nick 2014-10-20 18:43:52

+0

@尼克 - 對不起,我誤解了你的問題。請參閱我的編輯。 – iCodez 2014-10-20 18:46:27

0

您可以使用列表理解。

獲取字符串類型的所有元素:

b = [x for x in a if isinstance(x,str)] 

獲取字符串類型元素的所有索引:

b = [x[0] for x in enumerate(a) if isinstance(x[1],str)]