Skip to main content
 首页 » 编程设计

python之是否有函数可以给出列表中通过标准的项目数

2025年05月04日14findumars

所以我有一个数组,比如 [5,2,2,0],是否有函数返回通过标准的元素数量?

目前我正在这样做:

a = [5,2,2,0] 
len([i for i in a if i > 0]) 

也有人提出了这种方法:

sum(b > 0 for b in a) 

但在我看来,这实际上是一回事,只是可读性差了一点。

我可以使用这样的方法吗:

def crit(x): return x > 0 
a.count(criterion=crit) 

请您参考如下方法:

您无能为力,但如果您已经有了谓词

def crit(x): 
   return x > 0 

你可以做到

sum(map(crit, a)) 

或

len(filter(crit, a)) 

len([x for x in a if x > 0]) 是最有效的,但如果您想重用谓词,可能会导致代码重复。

测试:

In [6]: %timeit len([x for x in a if x > 0]) 
100000 loops, best of 3: 3.57 us per loop 
 
In [7]: def crit(x): 
   ...:     return x > 0 
   ...: 
 
In [8]: %timeit len([x for x in a if crit(x)]) 
100000 loops, best of 3: 10.1 us per loop 
 
In [9]: %timeit sum([x > 0 for x in a]) 
100000 loops, best of 3: 5.66 us per loop 
 
In [10]: %timeit sum([crit(x) for x in a]) 
100000 loops, best of 3: 12 us per loop 
 
In [11]: %timeit sum(map(crit, a)) 
100000 loops, best of 3: 11.3 us per loop 
 
In [12]: %timeit len(filter(crit, a)) 
100000 loops, best of 3: 8.21 us per loop 

生成器(生成器没有len):

In [13]: %timeit sum(1 for x in a if x > 0) 
100000 loops, best of 3: 3.99 us per loop 
 
In [14]: %timeit sum([1 for x in a if crit(x)]) 
10000 loops, best of 3: 10.6 us per loop 
 
In [15]: %timeit sum(x > 0 for x in a) 
100000 loops, best of 3: 6.24 us per loop 
 
In [16]: %timeit sum(crit(x) for x in a) 
100000 loops, best of 3: 13 us per loop 

imap 比 map 快:

In [17]: %timeit sum(itertools.imap(crit, a)) 
100000 loops, best of 3: 10.7 us per loop 

在测试了所有这些之后,我想我会选择 [13]、[17] 或 [14]。