使用if-else列表条件捕获百分比值

时间:2014-06-16 05:47:29

标签: python list python-2.7

对于排序列表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]

任何建议都会对修复这个条件表示赞赏。

2 个答案:

答案 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