如何查看特定类型的对象是否在Python列表中?

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对象

Ash*_*ary 5

用途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)

imapmap版本之间的区别是imap返回一个迭代器,所以in它上面的调用会发生类似的短路,any并且会比map(中小型列表除外)更快,因为map先在内存中创建一个列表,然后我们检查对于该项目.any因为Python for循环比in以C速运行的运算符慢,所以速度很慢.

  • 这比`map`解决方案更好,因为它可以立即清楚代码试图完成的任务......(性能优势只是一个奖励). (2认同)