繁体   English   中英

有没有比遍历列表更快的方法来检查python列表中的所有对象是否都是int实例(或其他类)?

[英]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

再一次,使用maplambda方法要慢得多。


(我将尝试忘记我写的这本书。)

简明:

>>> 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM