如何檢查Python列表中的特定對象類型?例如說,我要檢查在列表L的ast
模塊對象標或_ast.Subscript:如何查看特定類型的對象是否在Python列表中?
if Subscript in l:
return True
但這一直沒有工作。任何有關這個問題的幫助將不勝感激。
也在0x7ff7f7f7f7ff>
如何檢查Python列表中的特定對象類型?例如說,我要檢查在列表L的ast
模塊對象標或_ast.Subscript:如何查看特定類型的對象是否在Python列表中?
if Subscript in l:
return True
但這一直沒有工作。任何有關這個問題的幫助將不勝感激。
也在0x7ff7f7f7f7ff>
對象打印爲< _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
使用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
imap
和map
版本之間的不同之處在於imap
返回一個迭代,所以in
通話它將短路類似any
和它要快於map
(except for tiny-mid sized lists),因爲map
首先在內存中創建一個列表然後我們檢查這個項目。 any
比較慢,因爲Python for-loop比運行在C-speed的in
運算符慢。
所以你想檢查'l'是否包含'_ast.Subscript'類型的元素?這與檢查'_ast.Subscript'類型本身是否在列表中不一樣...... –