Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取满足条件的列表的百分比_Python_List - Fatal编程技术网

Python 获取满足条件的列表的百分比

Python 获取满足条件的列表的百分比,python,list,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 有没有一种简单的方法可以做到这一点?计算与sum匹配的内容,然后除以长度,再乘以1

当然,对于循环和其他丑陋的、非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
有没有一种简单的方法可以做到这一点?

计算与sum匹配的内容,然后除以长度,再乘以100

def percentage(L, predicate):
    return (sum(1.0 for v in L if predicate(v)) / len(L)) * 100
不会创建额外的列表对象来生成该值,从而生成一个常量内存算法

演示:

计算与sum匹配的值,然后除以长度,再乘以100

def percentage(L, predicate):
    return (sum(1.0 for v in L if predicate(v)) / len(L)) * 100
不会创建额外的列表对象来生成该值,从而生成一个常量内存算法

演示:

这个怎么样

100 * ( len([x for x in l if property(x)]) / len(l) )
这个怎么样

100 * ( len([x for x in l if property(x)]) / len(l) )

另一种选择是利用真为1和假为0的优势:


另一种选择是利用真为1和假为0的优势:

我们得到的答案能够接受任何iterable,包括任何生成器表达式。由于您通常无法计算生成器的长度,因此这可能很有用

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)

我们得到的答案能够接受任何iterable,包括任何生成器表达式。由于您通常无法计算生成器的长度,因此这可能很有用

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)

这里有一个超快速的东西,在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 25 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 25 0

这看起来可能比另一个答案快。谢谢你的帮助。@theage:不,因为它必须生成一个列表对象,所以这个比较慢。在Python 2中,这也将使用整数除法,这将导致不正确的舍入。例如,四分之一秒的测试用例将报告为0%。最后但并非最不重要的一点是,您希望测试lenl而不是lenx。这看起来可能比另一个答案更快。谢谢你的帮助。@theage:不,因为它必须生成一个列表对象,所以这个比较慢。在Python 2中,这也将使用整数除法,这将导致不正确的舍入。例如,四分之一秒的测试用例将报告为0%。最后但并非最不重要的一点是,您希望测试lenl而不是lenx。property会隐藏内置属性函数并应重命名。您丑陋的、非Python的尝试在哪里?请注意无法处理空的、长度为0的列表的答案……因为循环既不丑陋,也不非Python。人们从何而来的错误想法,即大的一行程序比简单的循环好?属性隐藏了内置的属性函数,应该重新命名。你丑陋的、非pythonic的尝试在哪里?请注意不能处理空的、长度为0的列表的答案……因为循环既不丑陋也不非pythonic。人们从哪里得到了一个错误的想法,即大的一行程序比简单的循环好?出于兴趣,为什么在这里给出第二个参数求和?@NPE从一个浮点开始求和,意味着它以一个浮点结束,而不是以Python 2.xOut中的除法的duff结果结束,为什么在这里给出第二个参数求和?@NPE从一个浮点开始求和,意味着它以一个浮点结束,而不是以Python 2中除法的duff结果结束。但是,这对于常规列表来说太过分了。但是对于常规列表来说太过分了。