簡體   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