Python 获取满足条件的列表的百分比
当然,对于循环和其他丑陋的、非pythonic的东西来说,这是一件非常简单的事情。从本质上讲,是否有一种方法(最好是单行程序)可以遍历列表并获得保存属性的百分比?比如说,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
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结果结束。但是,这对于常规列表来说太过分了。但是对于常规列表来说太过分了。