获取符合条件的列表的百分比

时间:2014-03-15 19:21:01

标签: python list

当然,这对于循环和其他丑陋的非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

有一种简单的方法吗?

6 个答案:

答案 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 1False0的替代方案:

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