For循环,Python中的重复计算

时间:2012-05-15 22:30:28

标签: python for-loop repeat

from random import uniform

prob = [0.25,0.30,0.45]

def onetrial(prob):
    u=uniform(0,1)
    if 0 < u <= prob[0]:
        return 11
    if prob[0] < u <= prob[0]+prob[1]:
        return 23
    if prob[0]+prob[1] < u <= prob[0]+prob[1]+prob[2]:
        return 39

print onetrial(prob)

我想知道如何使用一些for循环技术减少def中的重复部分。感谢。

3 个答案:

答案 0 :(得分:1)

以下内容相当于您当前的代码,它使用for循环:

from random import uniform

prob = [0.25, 0.30, 0.45]

def onetrial(prob):
    u = uniform(0, 1)
    return_values = [11, 23, 39]
    total_prob = 0
    for i in range(3):
        total_prob += prob[i]
        if u <= total_prob:
            return return_values[i]

我对你返回的值与概率之间的关系有点不清楚,似乎你的代码prob总是会有3个元素,所以我也做了这个假设。

答案 1 :(得分:1)

我喜欢F.J的答案,但我会使用一个元组列表,假设您可以轻松地这样做:

from random import uniform

prob = [(0.25, 11), (0.30, 23), (0.45, 39)]

def onetrial(prob):
    u = uniform(0, 1)
    total_prob = 0
    for i in range(3):
        total_prob += prob[i][0]
        if u <= total_prob:
            return prob[i][1]

答案 2 :(得分:0)

假设您经常致电onetrial,请首先计算CDF以使其更快一点:

from random import uniform

vals = [11, 23, 39]
prob = [0.25, 0.30, 0.45]
cdf = [sum(prob[0:i+1]) for i in xrange(3)]

def onetrial(vals, cdf):
    u = uniform(0, 1)
    for i in range(3):
        if u <= cdf[i]:
            return vals[i]

您可以使用bisect来加快速度。