[英]Iterate Function through List
我有一個函數prime(x),如果x是素數則返回True,如果x是假,則返回False。
是否有一種有效的方法來遍歷列表,如果所有成員都滿足該函數,則返回True,否則返回false?
對於最好的例子,我寫道:
def primecheck(x):
for index in xrange(0,len(x)):
if prime(x[index])==False:
return False
break
return True
但我認為這是低效的,必須有一個更好的方法來做到這一點。
有沒有一種標准方法可以通過列表迭代泛型函數(我將泛型函數定義為評估整數或字符串為True或False的東西),而不必每次都執行上述操作? 或者即使沒有標准方法,有沒有比運行列表索引更有效的方法?
是的! all
與生成器表達式一起使用:
def primecheck_all(x):
return all(prime(n) for n in x)
這與執行以下操作大致相同:
def primecheck_longway(x):
for n in x:
if not prime(n):
return False
return True
做一些計時,看來primecheck_longway
實際上更快,盡管primecheck_all
更容易閱讀。 primecheck_xrange
(您的版本)最慢:
>>> def prime(n):
#simple function so all timing goes to how the list check is done
return n % 2 == 0
>>> l = range(100)
>>> timeit.timeit(lambda: primecheck_all(l))
1.4247075990295475
>>> timeit.timeit(lambda: primecheck_longway(l))
0.6282418298159413
>>> timeit.timeit(lambda: primecheck_xrange(l))
1.161489160644436
>>> l = range(2,100,2)
>>> timeit.timeit(lambda: primecheck_all(l))
10.058764784981875
>>> timeit.timeit(lambda: primecheck_longway(l))
7.728265179204939
>>> timeit.timeit(lambda: primecheck_xrange(l))
10.481824344034152
這可能是由於不必具有發電機的開銷。 對於100萬次迭代,這是一個2.3秒的差異,以便對其進行透視。
無論如何,你的代碼與all
代碼的代碼非常相似。 對代碼進行一些更改即可
def primecheck(x):
for i in x:
if not prime(i):
return False
return True
我改變的只是循環x
而不是range
,並刪除不必要的break
。
使用all
更整潔,但長版本適用於非常舊版本的Python(<2.5)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.