baa*_*ezx 0 python list object
如何检查Python列表中的特定对象类型?例如,我想ast在列表l中检查模块对象Subscript或_ast.Subscript:
if Subscript in l:
return True
Run Code Online (Sandbox Code Playgroud)
但这还没有奏效.任何有关此问题的帮助将不胜感激.
对象也在0x7ff7f7f7f7ff>处打印为<_ast.Subscript对象
用途any:
any(isinstance(x, ast.Subscript) for x in lst)
Run Code Online (Sandbox Code Playgroud)
时间比较:
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
Run Code Online (Sandbox Code Playgroud)
imap和map版本之间的区别是imap返回一个迭代器,所以in它上面的调用会发生类似的短路,any并且会比map(中小型列表除外)更快,因为map先在内存中创建一个列表,然后我们检查对于该项目.any因为Python for循环比in以C速运行的运算符慢,所以速度很慢.