2013-12-10 73 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)。