当然,这对于循环和其他丑陋的非pythonic事物来说非常容易。从本质上讲,是否有一个方法(最好是一个单行程),它将迭代一个列表并获得一个持有属性的百分比?例如,
def predicate(x):
#Returns if x is even
return x % 2 == 0
#Performed on [1,2,3,4]
50
#Performed on [5,3,7,2]
25
有一种简单的方法吗?
答案 0 :(得分:3)
计算与sum()
匹配的内容,然后除以长度,乘以100
def percentage(L, predicate):
return (sum(1.0 for v in L if predicate(v)) / len(L)) * 100
不会创建额外的列表对象来生成值,从而产生恒定的内存算法。
演示:
>>> def percentage(L, predicate):
... return (sum(1.0 for v in L if predicate(v)) / len(L)) * 100
...
>>> def property(x):
... #Returns if x is even
... return x % 2 == 0
...
>>> percentage([1,2,3,4], property)
50.0
>>> percentage([5,3,7,2], property)
25.0
答案 1 :(得分:1)
这个怎么样?
100 * ( len([x for x in l if property(x)]) / len(l) )
答案 2 :(得分:1)
另一种利用True
1
和False
为0
的替代方案:
sum(map(property, your_list), 0.0) / len(your_list) * 100
答案 3 :(得分:0)
>>> l = [1, 2, 3, 4]
>>> len(filter(property, l)) * 100 / len(l)
50
>>> l = [5, 3, 7, 2]
>>> len(filter(property, l)) * 100 / len(l)
25
答案 4 :(得分:0)
从Need a fast way to count and sum an iterable in a single pass
获取结果我们得到一个能够采用任何迭代的答案,包括任何生成器表达式。由于您通常不能使用发电机的长度,因此这可能很有用。
def predicate(x):
#Returns if x is even
return x % 2 == 0
def percentage(iterable, conditional):
import itertools
from collections import deque
it = (1.0 if conditional(i) else 0.0 for i in iterable)
res = deque(enumerate(itertools.accumulate(it), 1), maxlen=1)
if len(res) == 0:
return 0.0
return 100.0 * res[0][1]/res[0][0]
L1 = [1,2,3,4]
percentage(L1, predicate)
# 50.0
L2 = [5,3,7,2]
percentage(L2, predicate)
答案 5 :(得分:0)
这里有超快速的东西,适用于Python 2& 3,处理空列表,并且是一行的:
def predicate(x):
return x % 2 == 0 # x even?
for lst in [1,2,3,4], [5,3,7,2], []:
print(0.0 if not lst else sum(map(predicate, lst), 0.0) / len(lst) * 100)
输出:
50.0
25.0
0.0