Python 是否有一个函数给出列表中通过标准的项目数?

Python 是否有一个函数给出列表中通过标准的项目数?,python,Python,我有一个数组,比如说[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

我有一个数组,比如说
[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([x代表x,如果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
):

imap
map
快:

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


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

您可以做的其他事情不多,但如果您已经有了谓词

def crit(x):
   return x > 0
你能行

sum(map(crit, a))

len([x代表x,如果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
):

imap
map
快:

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


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

你可以使用
filter
函数
len(filter(crit,a))
你可以使用
filter
函数
len(filter(crit,a))

我会选择
sum
方法,而不是具体化一个列表-如果你觉得那样可怕,只需编写一个助手函数:

def count_if(f, iterable):
    return sum(1 for i in iterable if f(i))
或者更好地使用以下选项之一:


我会选择
sum
方法,而不是将列表具体化-如果您觉得它很可怕,只需编写一个helper函数:

def count_if(f, iterable):
    return sum(1 for i in iterable if f(i))
或者更好地使用以下选项之一:


len(列表理解)方法有什么问题?它可读且相当简洁。@sby,对于一个大的列表,过滤后的列表会消耗大量内存。生成器表达式可能更好。@sbumb-乌戈伦说的。len(列表理解)方法有什么错?它可读且相当简洁。@sby,对于一个大的列表,过滤后的列表会消耗大量内存。生成器表达式可能更好。@sbimb-乌戈伦所说的。然后crit将被更改为
x%2==0
sum(map(crit,A))
将不正确,而且hello bugs。您不需要临时列表,只要
sum(x>0代表A中的x)
sum(1代表A中的x,如果x>0)
列表或生成器是一种优化决策-生成器的时间效率较低,但内存效率较高。当然,为了可读性,生成器更干净。我喜欢您区分生成器和列表-但不幸的是,它们都不是我真正想要的,然后crit将被更改为
x%2==0
sum(map(crit,a))
将不正确,而且你好,bug。您不需要临时列表,只需要
sum(x>0表示a中的x)
sum(如果x>0,则a中的x为1)
List或generator是一种优化决策-generator的时间效率更低,但内存效率更高。为了可读性,当然,generator更干净。我喜欢您区分generator和List,但不幸的是,这两者都不是我想要的