2013-12-10 71 views
3

我有一個函數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的東西),而不必每次都進行上述操作?或者即使沒有標準的方法,是否有比運行列表索引更有效的方法?

回答

3

是的!在串聯使用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秒的差異。

+0

很酷!只有一個建議:儘量不要使用'l'作爲標識符,很容易與一個'1'混淆。 – Ray

+2

哇。我沒有想到「全部」會慢得多。 –

1

您的代碼與all的工作方式非常相似。對您的代碼進行少許修改給出了這樣的

def primecheck(x): 
    for i in x: 
     if not prime(i): 
      return False 
    return True 

我所改變的是循環遍歷x代替range,並消除不必要的break

使用all較爲簡單,但長手版本也適用於Python的非常非常舊的版本(< 2.5)。