[英]Is there a faster way to check if all objects in a python list are int instances (or some other class) than iterating over the list?
我想验证给定列表中包含的所有对象都是int
(或某个其他类或一组类)的实例。
例如,我可以这样做:
my_list = [1, 2, 3, 4] for i in my_list: if not isinstance(i, int): raise Exception('Found a non-int!')
有比遍历列表更快的方法吗? 我是否需要扩展列表类以包含每个添加的类的集合或其他内容?
您可以像这样将all()与isinstance()合并
a = [1, 2, 3, 4]
# return true
print(all(isinstance(i, int) for i in a))
b = [1, 2, 3, 4.5]
# return false
print(all(isinstance(i, int) for i in b))
#for list of instances
c = ['hello', 2, 3, 4]
#return true
print(all(isinstance(i, (int, str)) for i in c))
让我再试一遍。 我最初的回答很简洁,但是很可惜。 在同样的主题下,我想到了一种替代lambda
的构造。 正确的结果。 也许这样可以更快地达到所需的结果?
>>> my_list = [0,2,3,4]
>>> all(map(lambda x: type(x)==int, my_list))
True
因此,我对两种方法进行了计时:
s = '''\
my_list = [0, 2, 3, 4]
for i in my_list:
if not isinstance(i, int):
raise Exception('Found a non-int!')'''
print (timeit.timeit(s))
s = '''\
my_list = [0,2,3,4]
all(map(lambda x: type(x)==int, my_list))'''
print (timeit.timeit(s))
具有以下输出:
0.6864084666728032
1.3789049683458745
基于map
的方法不仅速度更快,而且花费的时间是原来的两倍。 毫不畏惧(如果您愿意,也可以小气),我认为可能会有某种准备时间来解释“我的”方法的性能。 所以我尝试了一个更大的列表。
s = '''\
my_list = list(range(2000))
for i in my_list:
if not isinstance(i, int):
raise Exception('Found a non-int!')'''
print (timeit.timeit(s))
s = '''\
my_list = list(range(2000))
all(map(lambda x: type(x)==int, my_list))'''
print (timeit.timeit(s))
结果如下:
305.03338925738615
478.1060787659975
再一次,使用map
和lambda
方法要慢得多。
(我将尝试忘记我写的这本书。)
简明:
>>> my_list = [1,2,3,4]
>>> all(map(int, my_list))
True
在Python中,列表可以包含任何类型的项目。
>>> a_list = [1, 'b', 5, 7]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.