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