Python 列表理解控制流

Python 列表理解控制流,python,list-comprehension,control-flow,Python,List Comprehension,Control Flow,我试图利用列表理解来重新创建包含多个elif语句的函数的结果 我的程序目前是这样的 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 <

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

我的程序目前是这样的

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)

但是这将返回
x
的所有元素,其中
num您可以使用
next(iterable)
非常有效:
next(outcome for outcome,prob in zip(x,prob),如果num的概率总和通常为1.0,即
probs=[0.5,0.25,0.15,0.1]

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

numpy.random.choice([1,2,3,4],p=probs)

如果是我,这就是我会使用的解决方案;p

如果你只想第一次出现,你可以用
next
函数调用来包装你的列表理解,例如:
next(x[I]表示num in u表示I,test in enumerate(Prob)if num Lines of Code从来都不是一个好的软件度量标准,几乎在任何情况下都是如此。事实上,你的顶级代码块运行速度要快得多,可读性也要比建议的答案高得多。非常聪明,不可读,比原始帖子的链接if慢6倍左右。我认为zip和两个嵌套的for循环会同时运行如果速度很重要,请使用Joran Beasley基于NumPy的解决方案。如果您想使用迭代器解决问题(这大概是询问者想要的),请使用此解决方案。
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
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
numpy.random.choice([1,2,3,4],p=probs)