如何在python中从lambda获取布尔值?

时间:2017-07-03 18:32:18

标签: python lambda

我正在尝试将值输入lambda,如果值连续5次超过某个限制我想从函数返回1,我使用过滤器,但每次执行if语句。我应该如何使用lambda实现它?请提出任何其他建议。

rpm = [45,20,30,50,52,35,55,65]
rpm_limit=45

def check():
    x, i = 0, 0 
    while i < len(rpm):
        if (filter(lambda x: x > rpm_limit, rpm)): # rpm values will be feeded continuously
            x=x+1
            print("RPM: ",rpm[i])
            if x >= 5:
                return 1
            else:
                x=0
        i += 1
    return 0    

print(check())

2 个答案:

答案 0 :(得分:1)

如果您已经开始使用lambda表达式,我认为reduce更适合您的目的。

def check():
    max_consec = reduce(lambda acc, r: acc + 1 if r > rpm_limit else 0, rpm, 0)
    return 1 if max_consec >= 5 else 0

以下是正在发生的事情:acc每次rpm超过最大值时都会增加,并且每次没有时都会设置为0。这给了我们最长rpms的最长条纹,我们用它来决定是返回1还是0。

demo

编辑:对于python 3,您需要从reduce导入functools。例如,参见演示。

EDIT2:纠正了一些错误的逻辑。在这个新的例子中,如果满足最大条纹长度,acc将继续递增,因此每当超过最大条纹长度时,结束谓词为真。有关实例,请参阅上面的演示链接。

def check():
    max_consec = reduce(
      lambda acc, r: acc + 1 if (r > rpm_limit or acc >= max_streak) else 0, rpm, 0)
    return 1 if max_consec >= max_streak else 0

答案 1 :(得分:0)

这不是你想要的吗?如果没有filter和lambda,您可以创建一个新的0/1列表(如果超出限制,则为1)。之后你只需要总结一下:

rpm = [45,20,30,50,52,35,55,65]
rpm_limit=45

def check():
    exceedLimit = [1 if x > rpm_limit else 0 for x in rpm] 
    return sum(exceedLimit)

print('RPM exceeded the limit %s times' % check())

返回:

RPM exceeded the limit 4 times