2014-03-24 23 views
0

如何檢查Python列表中的特定對象類型?例如說,我要檢查在列表L的ast模塊對象標或_ast.Subscript:如何查看特定類型的對象是否在Python列表中?

if Subscript in l: 
    return True 

但這一直沒有工作。任何有關這個問題的幫助將不勝感激。

也在0x7ff7f7f7f7ff>

+1

所以你想檢查'l'是否包含'_ast.Subscript'類型的元素?這與檢查'_ast.Subscript'類型本身是否在列表中不一樣...... –

回答

3

對象打印爲< _ast.Subscript對象見下文:

#if Subscript is an instance of a type 
if type(Subscript) in map(type,l): 
    return True 

# or if Subscript is a type such as a class 
if Subscript in map(type,l): 
    return True 
+3

或者,在一行中:'map(type,l)'中的返回類型(下標)' – Santa

+1

對於短路,您可以使用'itertools.imap'。 –

+1

@Aशwiniचhaudhary或Python 3'map()'。每個人都應該編寫Python 3兼容(如果不是唯一的)代碼;-) – delnan

5

使用any

any(isinstance(x, ast.Subscript) for x in lst) 

時序比較:

In [20]: from itertools import imap 

In [21]: lis = range(10**5) + ['a'] 

In [22]: %timeit any(isinstance(x, str) for x in lis) 
100 loops, best of 3: 18.7 ms per loop 

In [23]: %timeit str in map(type, lis) 
100 loops, best of 3: 4.28 ms per loop 

In [24]: %timeit str in imap(type, lis)     #winner 
100 loops, best of 3: 3.8 ms per loop 


In [25]: lis = ['b'] + range(10**5) + ['a'] 

In [26]: %timeit any(isinstance(x, str) for x in lis) 
1000000 loops, best of 3: 533 ns per loop 

In [27]: %timeit str in map(type, lis) 
100 loops, best of 3: 3.34 ms per loop 

In [28]: %timeit str in imap(type, lis)     #winner 
1000000 loops, best of 3: 227 ns per loop 


In [29]: lis = range(10**3) + ['a'] + range(10**4) 

In [30]: %timeit any(isinstance(x, str) for x in lis) 
10000 loops, best of 3: 187 µs per loop 

In [31]: %timeit str in map(type, lis) 
1000 loops, best of 3: 372 µs per loop 

In [32]: %timeit str in imap(type, lis)     #winner 
10000 loops, best of 3: 38.3 µs per loop 

imapmap版本之間的不同之處在於imap返回一個迭代,所以in通話它將短路類似any和它要快於mapexcept for tiny-mid sized lists),因爲map首先在內存中創建一個列表然後我們檢查這個項目。 any比較慢,因爲Python for-loop比運行在C-speed的in運算符慢。

+0

這真的比列表中的所有項目的類型更好,更少的開銷。 – alecxe

+0

打我吧......這比'map'解決方案更好,因爲它會在第一個匹配的實例上短路。 –

+2

這比'map'解決方案更好,因爲它立即清楚代碼要完成什麼......(性能優勢只是一種獎勵)。 – mgilson

相關問題