首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列表理解控制流程

列表理解控制流程
EN

Stack Overflow用户
提问于 2015-09-28 19:35:48
回答 2查看 180关注 0票数 3

我试图利用列表理解来重新创建涉及多个elif语句的函数的结果。

我的程序现在是这样的

代码语言:javascript
运行
复制
import numpy as np  

def myFunction(x):
    result = []
    for num in x:
        if num <= 0.5:
            result.append(1)
        elif num <= 0.75:
            result.append(2)
        elif num <= 0.9:
            result.append(3)
        else:
            result.append(4)

    return result

u = np.random.uniform(0,1,1000)

myFunction(u)

该程序生成一个包含1、2、3或4的列表,并具有适当的概率。我想知道是否有一种方法可以利用列表理解来完成同样的任务。

假设我得到了一个向量x = [1,2,3,4],我想要的结果,以及Prob = [0.5,0.75,0.9,1.0],第一个事件会发生的累积概率。我如何使用列表理解得到类似的结果?

我想做的事情是

代码语言:javascript
运行
复制
[x[i] for num in u for i, test in enumerate(Prob) if num <= test]

但是这会返回x的所有元素,num <= test和我只想要第一个元素。

我希望这使自和感谢任何帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-28 19:42:32

您可以使用next(iterable)来取得很好的效果:next(outcome for outcome, prob in zip(x, Prob) if num <= prob)将计算与for-循环的主体相同的数字:

代码语言:javascript
运行
复制
def myFunction2(x):
    outcomes = [1, 2, 3, 4]
    probs = [0.5, 0.75, 0.9, 1.0]
    result = []
    for num in x:
        o = next(o for o, p in zip(outcomes, probs) if num <= p)
        result.append(o)
    return result

当然,我们可以用列表理解来说明这一点,从而使整个功能变得更短:

代码语言:javascript
运行
复制
def myFunction3(x):
    outcomes = [1, 2, 3, 4]
    probs = [0.5, 0.75, 0.9, 1.0]
    result = [
        next(o for o, p in zip(outcomes, probs) if num <= p)
        for num in x
    ]
    return result
票数 4
EN

Stack Overflow用户

发布于 2015-09-28 19:50:14

通常概率之和为1.0ie probs = [0.5,0.25,0.15,0.1]

然后你可以做一些很简单的事情

代码语言:javascript
运行
复制
numpy.random.choice([1,2,3,4],p=probs)

如果是我,这就是我要用的解决办法;

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32830466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档