对于排序列表l = [1,1,1,1,1,2,2,2,3]
75%的“阈值”定义为pct_value = 0.75*sum(l)
我想找到达到阈值的值。在此给定列表中,自cumsum(l) = array([ 1, 2, 3, 4, 5, 7, 9, 11, 14])
起,threshond pct_value
与值l[-2]
交叉。我想编写一个程序,找到达到阈值的值。
我的if-else条件不正确:
pct_value = 10.5
[i+i if i+i < pct_value else i for i in L]
任何建议都会对修复这个条件表示赞赏。
答案 0 :(得分:1)
这就是你想要的吗?
def find_element(L):
pct = 0.75 * sum(L)
s = 0
for i, element in enumerate(L):
if s > pct:
break
else:
s += element
return L[i]
答案 1 :(得分:0)
您可以使用while循环从副本中删除尾随元素,直到您击中目标。这将返回满足所述条件的列表元素的副本:
li=[ 1, 2, 3, 4, 5, 7, 9, 11, 14]
li_c=li[:]
while sum(li_c)>=sum(li)*.75:
li_c.pop()
print li_c
# [1, 2, 3, 4, 5, 7, 9]
为了提高效率,您可以使用deque:
from collections import deque
li_c=deque(li)
tgt=sum(li)*.75
while sum(li_c)>=tgt:
li_c.pop()
print li_c
# deque([1, 2, 3, 4, 5, 7, 9])
如果您只是寻找索引而不是元素的副本,您还可以使用while循环来执行此操作:
i=1
while i<len(li):
if sum(li[0:i+1])>=tgt:
break
else:
i+=1
print i, li[0:i], i-len(li)
# 7 [1, 2, 3, 4, 5, 7, 9] -2