簡體   English   中英

通過列表迭代函數

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM